【问题标题】:Adding image to listview after listview item click在列表视图项目单击后将图像添加到列表视图
【发布时间】:2013-03-08 18:56:27
【问题描述】:

我正在开发一个应用程序,它有一个 listView 有 1 个显示内容的 textView 和一个 imageView。我想要的是,当我单击 listView 时,我想用我拥有的刻度线图像设置 imageView。它工作正常。一旦我单击 listView,刻度标记图像就会加载到我单击的那个 listview 项目上。

当我滚动时出现问题。当我滚动时,我可以看到下面的其他一些列表视图项目加载了一个刻度线。不确定图像是如何设置在该位置的。

我在某处读到,当 listView 滚动时,视图会刷新。这是造成问题的原因吗?

谁能帮忙解决这个问题?我希望图像显示(加载)在我单击的 listView 项目上,现在是其他 listView 项目。

下面是声明listView items的xml

method_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@android:color/white"
        android:text="This is a check box button which reacts upon the check that user clicks. I am testing it with the big string and checking how it looks" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignParentRight="true"
        android:layout_marginRight="34dp" />

</RelativeLayout>

下面是sn-p类的部分:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.method_list_main);

    final ListView list = (ListView)findViewById(R.id.listView1);

    adapter=new MethodLazyAdapter(this,ARRAY.preparationSteps,ARRAY.timeToPrepare,ARRAY.arrowValue,noOfSteps,list);
    list.setAdapter(adapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
             RelativeLayout ll = (RelativeLayout) view;
              ImageView image = (ImageView)ll.findViewById(R.id.imageView2);

              if(tick[position]){
                  tick[position] = false;
                    image.setImageResource(0);                      
              }
              else{
                  tick[position] = true;
                      image.setImageResource(R.drawable.select_right);  
              }

            System.out.println("Position is: "+position);


        }
    });
}

最初所有的 tick[i] 值都设置为 false。

下面是适配器类的getView函数

public View getView(final int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.method_item, null);

    TextView text = (TextView)vi.findViewById(R.id.textView1);
    text.setText(preparationSteps\[position\]);
    return vi;
}

【问题讨论】:

  • 您能否粘贴代码,因为即使在尝试 ViewHolder 后我也没有得到所需的输出

标签: android


【解决方案1】:

试试这个以获得你想要的东西

在公共区域添加这个变量

public SparseBooleanArray checked = new SparseBooleanArray();

然后在onItemClick

list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                boolean stat = checked.get(position, false);
                checked.put(position, !stat);
                adapter.setChecked();
                System.out.println("Position is: "+position);


            }
        });

在适配器类中

如果适配器不是活动中的子类,则在公共区域添加变量

private SparseBooleanArray checked = new SparseBooleanArray();

并将此方法添加到类中

public void setChecked(SparseBooleanArray ch){
    checked = ch;
   notifyDataSetChanged();
}

或者如果它的子类使用我们的 cheked 变量,我们定义了它

然后在getView方法中

public View getView(final int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.method_item, null);

    TextView text = (TextView)vi.findViewById(R.id.textView1);
    text.setText(preparationSteps\[position\]);

    ImageView image = (ImageView)vi.findViewById(R.id.imageView2);
    if(checked.get(position, false)){
          image.setImageResource(0);                      
    }
    else{
            image.setImageResource(R.drawable.select_right);  
    }
    return vi;
}

如果这对您有帮助,请告诉我。

【讨论】:

  • 这工作.. :) 非常感谢。它真的很可观。我被严重困住了。脱帽致敬。
【解决方案2】:

看看这篇文章:

android - populating ListView with data from JSONArray

原因是因为您错误地使用了转换后的视图。 按照我粘贴的帖子上的示例代码进行操作。

如果您每次都放大您的行视图,这个问题就会消失。但不推荐这种实现方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多