48259


[![Custom
Listview](https://i.stack.imgur.com/B2ZBc.png)](https://i.stack.imgur.com/B2ZBc.png)

別ActivityにてEditTextを2つ設置し、入力した値を別ActivityのCustom
ListViewで表示させると全てのレコードが同じPositionを参照しているのですが、DBに保存されているデータを全てループで表示させたいのです。。

[ListAdapter.java]

[code]

    public class ListItemAdapter extends BaseAdapter{
    
    private static final String TAG = "ListItemAdapter";
    
    Context context;
    LayoutInflater layoutInflater = null;
    ArrayList<ListItem> items;
    
    public ListItemAdapter(Context context) {
        this.context = context;
        this.layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    
    public void setListItem(ArrayList<ListItem> ListItemList) {
        this.items = ListItemList;
    }
    
    @Override
    public int getCount() {
      return items.size();
    }
    
    @Override
    public Object getItem(int position) {
        return items.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return items.get(position).getId();
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = layoutInflater.inflate(R.layout.list_item,parent,false);
        ((TextView)convertView.findViewById(R.id.word)).setText(items.get(position).getWord());
        ((TextView)convertView.findViewById(R.id.meaning)).setText(items.get(position).getMeaning());
    
        return convertView;
    }
    
[/code]

}

[ListActivity.java]

[code]

       private void wordList() {
    
        Cursor data = mDatabaseHelper.getData();
        ArrayList<String> listData = new ArrayList<>();
            while(data.moveToNext()) {
            //get the value from the database in column 1
            //then add it to the ArrayList
            listData.add(data.getString(1));
            }
    
        //create the list adapter and set the adapter
        //ListAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listData);
        ArrayList<ListItem> list = new ArrayList();
    
    
        String array[] = new String[listData.size()];
    
        ListItem listlist = new ListItem();
        for (int i = 0; i < listData.size();i++) {
            if (i % 2 == 0) {
                array[i] = listData.get(i);
                listlist.setWord(array[i]);
                list.add(listlist);
            }
    
            if (i % 2 == 1) {
                array[i] = listData.get(i);
                listlist.setMeaning(array[i]);
                list.add(listlist);
            }
    
        }
    
    
        ListItemAdapter adapter = new ListItemAdapter(ListActivity.this);
        adapter.setListItem(list);
        mListView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    
    
    }
    
[/code]


CC BY-SA 4.0
2018-09-09T02:31:48.023
48230
2018-09-10T15:16:32.200
14914
question
android java sqlite
DBにEditTextの入力値登録 => Custom Listviewで表示させると全てのリストが同じ値を参照してしまう

[code]

    ListItem listlist = new ListItem();
    for (int i = 0; i < listData.size();i++) {
        if (i % 2 == 0) {
            array[i] = listData.get(i);
            listlist.setWord(array[i]);
            list.add(listlist);
        }
        ...
    }
    
[/code]

この部分が問題のコードですね。  
ListItem listlist = new ListItem();←この宣言で作られたオブジェクトは一つです。  
一つのオブジェクトの中身を入れ替えながら同一のオブジェクトをリストに登録していっているので、最後にsetWordとsetMeaningで上書きされたAppleとRingoのみを表示するプログラムになっています。

正しくは以下のようにすると良いです。

[code]

    for (int i = 0; i < listData.size();i++) {
        if (i % 2 == 0) {
            ListItem listlist = new ListItem();
            listlist.setWord(listData.get(i));
            list.add(listlist);
        }
        ...
    }
    
[/code]

さらに余談ですが、DBの登録の仕方が特殊だと思います。  
狙ってやっているわけじゃないのであれば、  
WordとMeaningでそれぞれカラムを分けて登録したほうがプログラム的にも扱いやすいと思います。

またListViewのgetViewはViewをリサイクルして使うように設計されています。  
convertViewがnullの時のみViewをinflateして作成するようにして、  
なるべく出来上がってるViewは使いまわすようにしましょう。  
リストの表示数が大きくなると露骨にパフォーマンスに影響する部分ですので。


CC BY-SA 4.0
2018-09-10T15:16:32.200
48259
2018-09-10T15:16:32.200
28318
48230
answer