gpt4 book ai didi

java - Listview中的TextView onclick冲突

转载 作者:太空狗 更新时间:2023-10-29 12:44:40 24 4
gpt4 key购买 nike

我制作了一个用 list_row_layout.xml 填充的 ListView (其中填充了 json 可序列化类),我有可点击的 TextView 和 onclick 将文本从“接受”更改为“已接受”。但是当我在第一个 listview 项目上单击它时,下面的另一个 textview listview 项目正在改变。这是一些描述您的照片。

before单击第一行中的接受后 after clicking the accept in first row 在 Activity 类中

      feedListView.setAdapter(new CustomListAdapter(this, feedList));

列表适配器类

    public class CustomListAdapter extends BaseAdapter
{
private ArrayList<FeedItem> listData;
private LayoutInflater layoutInflater;
private Context mContext;

public CustomListAdapter(Context context, ArrayList<FeedItem> listData)
{
this.listData = listData;
layoutInflater = LayoutInflater.from(context);
mContext = context;
}

@Override
public int getCount()
{
return listData.size();
}

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

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


public View getView(int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
if (convertView == null)
{
convertView = layoutInflater.inflate(R.layout.list_row_layout, null);

holder = new ViewHolder();

holder.headlineView = (TextView)convertView.findViewById(R.id.title);
holder.reportedDateView = (TextView) convertView.findViewById(R.id.confid);
holder.approve = (TextView) convertView.findViewById(R.id.approveTV);

holder.approve.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View argView)
{
holder.approve.setText("accepted");
}
}
);

convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}

FeedItem newsItem = listData.get(position);

holder.headlineView.setText(Html.fromHtml(newsItem.getTitle()));
holder.reportedDateView.setText(Html.fromHtml(newsItem.getContent()));

holder.approve.setTag(newsItem);



return convertView;
}

static class ViewHolder
{
TextView approve;
TextView headlineView;
TextView reportedDateView;
ImageView imageView;
}
}

最佳答案

您的实际解决方案未正确实现。我认为问题是您的行没有正确回收 - 我认为问题确实是这样的:

holder.approve.setText("accepted");

尝试将其更改为:

((TextView) argView).setText("accepted");

这应该有效。但我建议你改变你的应用程序逻辑。查看您当前的解决方案。您正在为每一行分配 OnClickListener。例如,如果您有 1000 多行,它不会高效,不是吗?出于这个原因以及为了获得更好的性能,我建议您只创建一个 OnClickListener(让适配器类实现 View.OnClickListener),然后只为每一行分配该监听器:

holder.approve.setOnClickListener(this);

然后在onClick() 方法中执行与上面相同的操作:

@Override
public void onClick(View v) {
((TextView) v).setText("accepted");
}

现在一切正常 @Geralt 解决方案更新如下

更新:

问题稍微大一点是因为

  • 集合对您更改行的文本一无所知。当getView()方法被调用你正在用集合中的数据填充适配器但是我如何提到集合不知道运行时更改“你”做了如果你不会更新 Collection

我尝试使用 OnClickListener 保留您的原始解决方案,但现在我认为这不是正确的解决方案。因此,让我们制定可行的解决方案:

解决方案:

首先你需要使用OnItemClickListener而不是当前监听器 - 它直接指定给 AdapterView 子类。包含方便的信息,例如整行及其内容,适配器中的位置只是您需要的信息。

然后您需要创建一种机制,让您的 Collection 项“不会忘记被点击”。这可以做到:

  • Item 中代表行的下一个属性 boolean 变量isClicked(当您点击行时,只需在点击位置找到集合中的项目并将其属性更改为 true)1

    <
  • 创建被点击的位置列表(当您点击行时,将其位置保存到该列表中)2

那么您应该能够实现正确的行为。现在您需要做的就是在创建行的 getView() 方法中正确使用这些信息。做这样的事情:

#Solution with property(伪代码):

...
final Item i = collection.get(position);
if (i.isClicked()) {
// set text accepted
}
else {
// set text normal
}

#带有位置列表的解决方案(伪代码):

...
final Item i = collection.get(position);
if (positions.indexOf(position) > 0) {
// set text accepted
}
else {
// set text normal
}

最后是 onItemClick() 方法的例子:

@Override
public void onItemClick(AdapterView<?> a, View row, int position, long id) {
// solution with list of positions:
myAdapterClass.addPosition(position);

// solution with property
myAdapteClass.setItemClicked(position);

// update immediate after click row
((TextView) row.findViewById(R.id.yourTextViewId)).setText("Accepted");
}

Adapter 类中的方法:

public void addPosition(position) {
// if position is not in list
if (positions.indexOf(position) < 0) {
positions.add(position);
}
}

public void setItemClicked(position) {
// finds clicked item
if (collection.get(position) != null) {
collection.get(position).setIsClicked(true);
}
}

希望它能帮助你男人/女孩并解决你的问题。

关于java - Listview中的TextView onclick冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com