【问题标题】:Why not change position in getView() android?为什么不在 getView() android 中改变位置?
【发布时间】:2014-09-12 21:18:53
【问题描述】:

在arraylist中添加新数据后位置不会改变。

公共类 ItemsAdapter 扩展 BaseAdapter {

private Context context;
private LayoutInflater inflater;
private ArrayList<HashMap<String, String>> data;

public ItemsAdapter(Context context,
        ArrayList<HashMap<String, String>> arraylist) {
    this.context = context;
    data = arraylist;
}

@Override
public int getCount() {
    //=========HERE DATA IS COMING CORRECTLY===============
    for (int i = 0; i < data.size(); i++)
        System.out.println("Get Couunt Size : - "
                + data.get(i).get("Title"));
    return data.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Holder holder;
    if (convertView == null) {
        holder = new Holder();

        convertView = inflater.inflate(R.layout.item, parent, false);
        holder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
        holder.tvNotes = (TextView) convertView.findViewById(R.id.tvNotes);
        convertView.setTag(holder);
    } else {
        holder = (Holder) convertView.getTag();
    }

    //=========HERE POSITION ALWAYS 0===============
    System.out.println("Position:::" + position + " Title : - "
            + data.get(position).get("Title") + ", Notes :- "
            + data.get(position).get("Note"));

    holder.tvTitle.setText(data.get(position).get("Title"));
    holder.tvNotes.setText(data.get(position).get("Note"));
    return convertView;
}

private static class Holder {
    TextView tvTitle, tvNotes;
}

}

我还在主活动中调用 notifyDataSetChanged() 方法。

使用对话框添加数据。

dlAddNote = new Dialog(this);
    dlAddNote.setTitle("Add Note");
    dlAddNote.setContentView(R.layout.add_note_dialog);

    final EditText etTitle = (EditText) dlAddNote
            .findViewById(R.id.etTitle);
    final EditText etNotes = (EditText) dlAddNote
            .findViewById(R.id.etNotes);

    Button btnSave = (Button) dlAddNote.findViewById(R.id.btnSave);

    Button btnCancel = (Button) dlAddNote.findViewById(R.id.btnCancel);

    btnSave.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            HashMap<String, String> hashMap = new HashMap<String, String>();
            hashMap.put("Title", etTitle.getText().toString());
            hashMap.put("Note", etNotes.getText().toString());
            System.out.println("Title" + etTitle.getText().toString());
            System.out.println("Note" + etNotes.getText().toString());
            arrayListLeft.add(hashMap);

            dlAddNote.dismiss();

            leftAdapter = new ItemsAdapter(KeepGuiActivity.this,
                    arrayListLeft);
            listViewLeft.setAdapter(leftAdapter);
            leftAdapter.notifyDataSetChanged();
        }
    });

    btnCancel.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            dlAddNote.cancel();
        }
    });

    dlAddNote.show();

我正在使用自定义对话框并在运行时添加数据但不更改数据。

【问题讨论】:

  • 你的意思是当你添加一个项目时它没有显示??
  • 是的。我添加数据但不改变适配器中的位置
  • 你能把代码贴在你添加数据的地方吗?
  • 对话框是否只调用一次?
  • @Rod_Algonquin,它只显示第一个项目,之后它不显示更新的项目,每次位置都返回 0 :(

标签: android android-arrayadapter


【解决方案1】:

问题:

dlAddNote.dismiss();

它所做的是它会dismiss 你的对话框并且不会在它之后执行代码,这就是listview 不更新的原因。

解决方案:

dismiss 方法之前调用它并检查 leftAdapter 是否为 null 以避免一遍又一遍地重新创建列表视图。

btnSave.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {

        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("Title", etTitle.getText().toString());
        hashMap.put("Note", etNotes.getText().toString());
        System.out.println("Title" + etTitle.getText().toString());
        System.out.println("Note" + etNotes.getText().toString());
        arrayListLeft.add(hashMap);

        if(leftAdapter == null) {
           leftAdapter = new ItemsAdapter(KeepGuiActivity.this,  arrayListLeft);
           listViewLeft.setAdapter(leftAdapter);
        }
        leftAdapter.notifyDataSetChanged();

        dlAddNote.dismiss();
    }
});

【讨论】:

  • @EleshBaraiya 发布整个 ItemsAdapter 类
  • @EleshBaraiya 你从上面的代码得到什么结果?
  • 感谢朋友给我的答案。。它的布局错误。
【解决方案2】:

我测试了您的代码并且运行良好。它显示了我在对话框中输入的所有数据。 (仅供参考:我在 Activity 的范围内声明了所有变量,因为您没有将其显示给示例代码)。我把 Activity 的代码放在下面:

public class KeepGuiActivity extends Activity {

private Dialog dlAddNote;
private ListView listViewLeft;
private ArrayList<HashMap<String, String>> arrayListLeft;
private ItemsAdapter leftAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listViewLeft = (ListView)findViewById(R.id.listView1);

    arrayListLeft = new ArrayList<HashMap<String, String>>();

    Button button = (Button)findViewById(R.id.button1);

    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            showDialog();
        }

    });
}

private void showDialog() {
    dlAddNote = new Dialog(this);
    dlAddNote.setTitle("Add Note");
    dlAddNote.setContentView(R.layout.add_note_dialog);

    final EditText etTitle = (EditText) dlAddNote
            .findViewById(R.id.etTitle);
    final EditText etNotes = (EditText) dlAddNote
            .findViewById(R.id.etNotes);

    Button btnSave = (Button) dlAddNote.findViewById(R.id.btnSave);

    Button btnCancel = (Button) dlAddNote.findViewById(R.id.btnCancel);

    btnSave.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            HashMap<String, String> hashMap = new HashMap<String, String>();
            hashMap.put("Title", etTitle.getText().toString());
            hashMap.put("Note", etNotes.getText().toString());
            System.out.println("Title" + etTitle.getText().toString());
            System.out.println("Note" + etNotes.getText().toString());
            arrayListLeft.add(hashMap);

            dlAddNote.dismiss();

            leftAdapter = new ItemsAdapter(KeepGuiActivity.this,
                    arrayListLeft);
            listViewLeft.setAdapter(leftAdapter);
            leftAdapter.notifyDataSetChanged();
        }
    });

    btnCancel.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            dlAddNote.cancel();
        }
    });

    dlAddNote.show();
}

如果上述代码对您不起作用,请告诉我您是否使用代码从适配器返回特定项目。此外,您可以更新 ItemsAdapter 的以下方法以返回实际数据:

@Override
public Object getItem(int position) {
    return data.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多