【问题标题】:How to reset the whole View by clicking the delete Button如何通过单击删除按钮重置整个视图
【发布时间】:2015-06-17 15:00:08
【问题描述】:

我制作了一个自定义视图,其中包含一个 ImageView、一个 TextView 和一个删除按钮。
当我单击与之关联的删除按钮时,我想重置特定视图。
请告诉如何实现。

这是我的 MainActivity.java

package com.khurana.nikhil.list1;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
ListView lv;
TextView tv1, tv2;
View v1;
public String[] s = {"nikhil", "mukul", "kunal"};
public int[] img = {R.drawable.rty, R.drawable.sf, R.drawable.rty};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ListView lv = (ListView) findViewById(R.id.listView);


    CustomAdapter cad = new CustomAdapter(MainActivity.this, s, img);
    lv.setAdapter(cad);


    lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {

        public void onItemClick(AdapterView<?> parent,View v,int position,long id)
        {
            Toast.makeText(MainActivity.this,"You clicked "+s[position],Toast.LENGTH_SHORT).show();

        }

    });


}
} 

这里是 CustomAdapter.java

package com.khurana.nikhil.list1;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class CustomAdapter extends ArrayAdapter<String>{


Context c1;
String s1[];
int s2[];
CustomAdapter(Context c,String s[],int s3[])
{
    super(c,R.layout.tcustom,s);
    this.c1=c;
    this.s1=s;
    this.s2=s3;



}

public View getView(int position,View v,ViewGroup parent)
{
    LayoutInflater li=(LayoutInflater) c1.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

     v=li.inflate(R.layout.tcustom,null);
    TextView tv=(TextView)v.findViewById(R.id.textView);
    ImageView im=(ImageView)v.findViewById(R.id.imageview);
    tv.setText(s1[position]);
    im.setImageResource(s2[position]);
    Button bt=(Button)v.findViewById(R.id.button);
    return v;
}
}

【问题讨论】:

    标签: android android-layout listview android-activity android-arrayadapter


    【解决方案1】:
    ((LinearLayout)yourView.getParent()).removeView(yourView);
    

    或者你可以直接从布局中调用

    yourRelativeLayout.removeView(yourView)
    

    【讨论】:

      【解决方案2】:

      我建议在您的 Adapter 类中使用 ArrayList 而不是 String[]。它使删除或编辑视图及其背后的关联数据变得更加容易。我使用this post 将您的 String[] 转换为 ArrayList,删除该项目并转换回 String[]。

      这应该适用于按钮点击:

      在您的适配器类中:

      public View getView(int position,View v,ViewGroup parent)
      {
          LayoutInflater li=(LayoutInflater) c1.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      
          v=li.inflate(R.layout.tcustom,null);
          TextView tv=(TextView)v.findViewById(R.id.textView);
          ImageView im=(ImageView)v.findViewById(R.id.imageview);
          tv.setText(s1[position]);
          im.setImageResource(s2[position]);
      
          Button bt=(Button)v.findViewById(R.id.button);
          bt.setTag(position); //important so we know which item to delete on button click
      
          bt.setOnClickListener(new View.OnClickListener() {
           public void onClick(View v)
            {
              int positionToRemove = v.getTag(); //get the position of the view to delete stored in the tag
              removeItem(positionToRemove); //remove the item
            } 
          });
      
          return v;
      }
      
      public void removeItem(int position){
       //convert array to ArrayList, delete item and convert back to array
        ArrayList<String> a = new ArrayList<>(Arrays.asList(s1));
        a.remove(i);
        strings = new String[a.size()];
        s1= a.toArray(strings);
        notifyDataSetChanged(); //refresh your listview based on new data
      }
      
       @Override
       public int getCount() {
         return s1.length;
       }
      
       @Override
       public String getItem(int position) {
         return s1[position];
       }
      

      【讨论】:

      • .java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 在 com.khurana.nikhil.list1.CustomAdapter.getView(CustomAdapter.java:45)
      • tv.setText(s1[position]);
      • 我添加了您需要的 2 个功能。没有它们,您的适配器将不知道数组的大小已更改。
      【解决方案3】:

      GONE 的视图可见性也不会从内存中删除您的视图。请具体点,您是否想保留您对未来的看法?

      【讨论】:

      • 您要从列表中删除数据还是要从活动中删除视图?
      • 弗兰克在上面的回答完成了这两项任务。
      【解决方案4】:

      如果您在列表视图中工作,您应该调用适配器notifyDataSetChanged()。你的 getView() 方法可以是: 按钮上的操作可以是这样的

      Button bt=(Button)v.findViewById(R.id.button);
      bt.setOnClickListener(new View.OnClickListener() {
                  public void onClick(View v) {
      
                    s1 = ArrayUtils.remove(s1, position);
                    s2 = ArrayUtils.remove(s2, position);
                    notifyDataSetChanged();
                  }
              });
      

      【讨论】:

        【解决方案5】:

        如果你想让视图消失:

        yourView.setVisibility(View.GONE);
        

        编辑:获取按钮的父视图:Android: Making changes to a button's parent view

        【讨论】:

        • 这适用于点击视图。如何在点击按钮时设置该功能?
        • 在按钮上设置 onClickHandler 并查看我的编辑
        • 请注意,将视图可见性设置为 GONE 不会从用于填充列表视图的 String[] 数组中删除数据。
        • 您能否编辑 CustomAdapter 中的 getView() 部分以获得按钮功能?
        • @NikhilKhurana 我已经编辑了我的答案,所以它应该在按钮点击时起作用
        猜你喜欢
        • 1970-01-01
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2015-02-03
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多