【问题标题】:Edit an item in android list view在 android 列表视图中编辑项目
【发布时间】:2017-09-13 04:50:36
【问题描述】:

我是 android 开发新手,我有一个简单的问题, 我用ArrayAdapter 和一些字符串组成了一个ListView。 我希望在单击项目时更改该项目的文本(或任何其他属性,例如文本颜色)! 我这样做:

private AdapterView.OnItemClickListener MshowforItem = new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        ((TextView)view).setText("Hello");
    }
};

因此,当我单击任何项​​目时,它的文本会发生变化,但是当我向下/向上滚动然后转到该位置时,该项目的文本会更改为默认值!! 我该怎么办??????

【问题讨论】:

  • 更新列表和notifyDataSetChanged()中的值,告诉我你如何设置适配器的代码

标签: android listview view adapter


【解决方案1】:

一行你需要写yourArrayListData.set(position, your_model_new_data ));

详情

当您滚动 ListView 内部发生的事情时,这是非常无能为力的。

另一种图像表示...

所以你的问题是回收。当您向上滚动时,最上面的视图变得不可见。 当您向下滚动时,顶视图再次可见。并且它的数据得到你第一次初始化的表格模型。

因此您不会在 EditText 中返回已编辑的文本

我不是在描述更多,而是你的解决方案......

有很多方法...但是我认为您可以做到最好...

当您在项目中设置值时更新您的数据源单击一行

private AdapterView.OnItemClickListener MshowforItem = new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    ((TextView)view).setText("Hello");

     yourArrayListData.set(position, your_model_new_data ));
  }
};

您的示例代码..

//Suppose your model like this
public class Greetings {
    public String message;

    public Greetings(String message) {
        this.message = message;
    }
}
//So your ArrayList like 
ArrayList<Greetings> greetings = new ArrayList<Greetings>();

//You need to write code in one line like
greetings.set(position, new Greetings("hello") ));

就是这样......祝你好运......

【讨论】:

  • 谢谢,成功了。最好的解决方案是编辑主数据源。
【解决方案2】:

Listview 从我们在创建 ArrayAdapter 时提供的数据集 [ String Array ] 中填充。我们必须更新那个字符串数组的数据来持久化文本的变化。

代码:

    public class listviewActivity extends AppCompatActivity {
    ListView listView;

    String dataset[] = {"data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data", "data"};

    ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);
        listView = (ListView) findViewById(R.id.listview);
        arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, dataset);
        listView.setAdapter(arrayAdapter);
        listView.setOnItemClickListener(MshowforItem);
    }

    private AdapterView.OnItemClickListener MshowforItem = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            TextView tvTemp = ((TextView) view);

            dataset[position] = "Hello";
            tvTemp.setText(dataset[position]);

            arrayAdapter.notifyDataSetChanged();
        }
    };
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多