2012-03-19 84 views
1

我同时从ListView中删除项目有问题,如何从Android的ListView中正确删除一个项目?

这是我的活动:

public class TestListItemsView1Activity extends ListActivity { 
    /** Called when the activity is first created. */ 

    private EfficientAdapter efficientAdapter; 
    private String[] data = new String[] { "BBC", "Yahoo", "CNN", "Eenadu", "Hindu" }; 
    private List<String> dataValues = Arrays.asList(data); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 
     efficientAdapter = new EfficientAdapter(this,dataValues); 

     setListAdapter(efficientAdapter); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
     //dataValues.remove(position); 
     //efficientAdapter.notifyDataSetChanged(); 
     Toast.makeText(this, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show(); 
    } 
} 

和适配器类:

public class EfficientAdapter extends BaseAdapter implements Filterable{ 

    private LayoutInflater mInflater; 
    private static String TAG=EfficientAdapter.class.getSimpleName(); 
    private Context context; 

    private HashMap<String,EfficientAdapter.ViewHolder> holders= new HashMap<String, EfficientAdapter.ViewHolder>(); 
    //private String[] dataArray = new String[] { "BBC", "Yahoo", "CNN", "Eenadu", "Hindu" }; 
    private List<String> data= new ArrayList<String>();//Arrays.asList(dataArray); 

    public EfficientAdapter(Context context,List<String> data) { 
     //super(context, R.layout.main, values); 
     mInflater = LayoutInflater.from(context); 
     this.context=context; 
     this.data.addAll(data); 
    } 

    public EfficientAdapter(Context context) { 
     //super(context, R.layout.main, values); 
     mInflater = LayoutInflater.from(context); 
     this.context=context; 
     //data.addAll(data); 
    } 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if(convertView == null){ 
      convertView = mInflater.inflate(R.layout.adaptor_content, null); 

      holder = new ViewHolder(); 
      holder.textLine = (TextView) convertView.findViewById(R.id.textLine); 
      holder.buttonLine =(Button) convertView.findViewById(R.id.buttonLine); 

      holder.textLine.setText(this.data.get(position)); 
      convertView.setOnClickListener(new OnClickListener() { 
       private int pos= position; 
       public void onClick(View v) { 
        Toast.makeText(context, "Click-" + String.valueOf(pos), Toast.LENGTH_SHORT).show(); 

       } 
      }); 

      holder.buttonLine.setOnClickListener(new OnClickListener() { 
       private int pos= position; 

       public void onClick(View v) { 
        /*ViewHolder deleteHolder = (ViewHolder)v.getTag(); 
        int delPosition=deleteHolder.position; 
        holders.remove(delPosition); 
        ViewHolder currentHolder; 
        for(int i=pos+1;i<getCount();i++){ 
         currentHolder = holders.get(delPosition); 
         currentHolder.position=i-1; 
        } 
        data.remove(delPosition); 
        notifyDataSetChanged();*/ 
        //View convertView1 = mInflater.inflate(R.layout.adaptor_content, null); 
//     ViewHolder deleteHolder = (ViewHolder)v.getTag(); 

        data.remove(getItem(pos)); 
        notifyDataSetChanged(); 


        //final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter()); 


        //ListView lv = v.findViewById(R.layout.) 


        //v.invalidate(); 

        Log.i(TAG, "Delete button pressed at position" + pos); 
        Toast.makeText(context, "Delete-" + String.valueOf(pos), Toast.LENGTH_SHORT).show(); 

       } 
      }); 
      //holder.position=position; 
      //holders.put(Integer.toString(position), holder); 
      convertView.setTag(holder); 

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

     return convertView; 
    } 


    public int getCount() { 
     // TODO Auto-generated method stub 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return data.get(position); 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 


    public Filter getFilter() { 
     // TODO Auto-generated method stub 
     return null; 
    } 


    static class ViewHolder { 
     TextView textLine; 
     ImageView iconLine; 
     Button buttonLine; 
     //int position; 
     } 

} 

每当其删除最后一个项目不是其中之一点击。

回答

2

enter code here我认为你没有更新视图的位置。

当你做if (convertView == null) { inflate........}你说的第一次创建视图,必须做到这一点。但在Android中,ListView中的视图是可重用的,所以如果您需要更新视图的位置,则必须放弃此条件。

尝试将ClickLsitener设置为if (convertView = null) ...在else中。 试试吧......告诉我

public class EfficientAdapter extends BaseAdapter implements Filterable{ 

private LayoutInflater mInflater; 
private static String TAG=EfficientAdapter.class.getSimpleName(); 
private Context context; 

//private String[] dataArray = new String[] { "BBC", "Yahoo", "CNN", "Eenadu", "Hindu" }; 
private List<String> data= new ArrayList<String>(); 

public EfficientAdapter(Context context,List<String> data) { 
    super(); 
    mInflater = LayoutInflater.from(context); 
    this.context=context; 
    this.data.addAll(data); 
} 

public EfficientAdapter(Context context) { 
    super(); 
    mInflater = LayoutInflater.from(context); 
    this.context=context; 
} 
public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    if(convertView == null){ 
     convertView = mInflater.inflate(R.layout.adaptor_content, null); 
     holder = new ViewHolder(); 
     holder.textLine = (TextView) convertView.findViewById(R.id.textLine); 
     holder.buttonLine =(Button) convertView.findViewById(R.id.buttonLine); 
     convertView.setTag(holder); 

    } 
    holder =(ViewHolder) convertView.getTag(); 
    holder.textLine.setText(getItem(position)); 
    convertView.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      Toast.makeText(context, "Click-" + String.valueOf(position), Toast.LENGTH_SHORT).show(); 

     } 
    }); 
    holder.buttonLine.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      data.remove(position); 
      notifyDataSetChanged(); 
      Log.i(TAG, "Delete button pressed at position" + position); 
      Toast.makeText(context, "Delete-" + String.valueOf(position), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    return convertView; 
} 


public int getCount() { 
    // TODO Auto-generated method stub 
    return data.size(); 
} 

public String getItem(int position) { 
    // TODO Auto-generated method stub 
    return data.get(position); 
} 

public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

static class ViewHolder { 
    TextView textLine; 
    ImageView iconLine; 
    Button buttonLine; 
    //int position; 
} 

@Override 
public android.widget.Filter getFilter() { 
    return null; 
} 

}

工作!测试它:)

+0

已经移动到其他条件,但仍然相同 – radhakrishna 2012-03-19 17:10:57

+0

怎么样添加活动一个OnClickItemListener,然后调用'adapter.remove(int position)'。你必须在适配器中创建这个方法为public,并执行'data.remove(position)'。那个怎么样? – youchy 2012-03-19 17:16:15

+0

仍然不能正常工作 – radhakrishna 2012-03-19 17:28:59

相关问题