一个列表项中的按钮不可见导致其他列表项的按钮在该项目的 5、10、15、20 等空格处不可见

Posted

技术标签:

【中文标题】一个列表项中的按钮不可见导致其他列表项的按钮在该项目的 5、10、15、20 等空格处不可见【英文标题】:Button invisibility in one list item is leading to invisibility of buttons of other list items at the spaces of 5,10,15,20 and so on from that item 【发布时间】:2016-03-01 18:15:34 【问题描述】:

我正在处理我的项目,我有一个列表视图活动,它向我显示了来自数据库的一些餐馆的列表。每个列表视图项目都有一个按钮,当按下该按钮时,该按钮会将相应的餐厅添加到云上的另一个列表中并消失。所以,这就是它应该如何工作,但是当我按下按钮在云上添加该列表项时,其他列表项的按钮位于 5、10、15、20 等空间从该列表项中,也与我按下的那个按钮一起消失,这是不应该发生的。我在此处附上了该活动的代码,并且该项目按钮的逻辑在 add.setOnClickListener(new OnClickListener() ....) 中实现代码结束。

public class Restaurants_List extends ListActivity 

ArrayList<PLan_List_Data> places;
ListView lv;
String budget, radius;
Boolean isInternetPresent = false;

// Connection detector class
ConnectionDetector cd;

// Alert Dialog Manager
AlertDialogManager alert = new AlertDialogManager();

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.plan_list);

    cd = new ConnectionDetector(getApplicationContext());
    lv = (ListView) findViewById(R.id.list);
    // Check if Internet present
    isInternetPresent = cd.isConnectingToInternet();
    if (!isInternetPresent) 
        // Internet Connection is not present
        alert.showAlertDialog(this, "Internet Connection Error",
                "Please connect to working Internet connection", false);
        // stop executing code by return
        return;
    

    this.getActionBar().setDisplayHomeAsUpEnabled(true);
    Bundle bun= getIntent().getExtras();

    budget = bun.getString("budget");
    radius = bun.getString("radius");
    places = new ArrayList<PLan_List_Data>();
    placesList();






void populate()


    Myadaptee adap = new Myadaptee(this, places);
    setListAdapter(adap);



private void placesList() 

    ParseQuery<ParseObject> query = ParseQuery.getQuery("BudgetDatabase");
    setProgressBarIndeterminateVisibility(true);
    query.findInBackground(new FindCallback<ParseObject>() 

        @Override
        public void done(List<ParseObject> pl_list, ParseException e) 
            setProgressBarIndeterminateVisibility(false);
            // TODO Auto-generated method stub
            if (e == null) 
                // If there are results, update the list of posts
                // and notify the adapter
                places.clear();
                for (int i = 0; i < pl_list.size(); i++) 


                        PLan_List_Data myObject = new PLan_List_Data();
                        ParseObject object = pl_list.get(i);
                        if(Integer.valueOf(budget)>Integer.valueOf((String) object.get("Budgetnew")))
                        

                            myObject.id = object.getObjectId();
                            myObject.name = (String) object.get("Name");
                            myObject.address = (String) object.get("Address");
                            myObject.phone = (String) object.get("Phone");
                            myObject.distance = (String) object.get("Distance");
                            myObject.budget = (String) object.get("Budgetnew");
                            places.add(myObject);
                        
                

                populate();


             else 
                Log.d(getClass().getSimpleName(), "Error: " + e.getMessage());
            
        
    );

private void loadLoginView() 
    Intent intent = new Intent(this, Parse_login.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);


@Override
public boolean onOptionsItemSelected(MenuItem item) 
    switch(item.getItemId())
    
        case (android.R.id.home):
            finish();
            break;
        case (R.id.action_logout):
            
            //ParseUser currentUser = ParseUser.getCurrentUser();
            ParseUser.logOut();
            loadLoginView();
            break;
            
    
    return super.onOptionsItemSelected(item);


@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;



class Myadaptee extends BaseAdapter
ArrayList<PLan_List_Data> places;
Context con;
//LayoutInflater inflater;
public Myadaptee(Context c, ArrayList<PLan_List_Data> places)
    this.con=c;
    this.places=places;


@Override
public int getCount() 
    // TODO Auto-generated method stub
    return places.size();


@Override
public Object getItem(int position) 
    // TODO Auto-generated method stub
    return places.get(position);


@Override
public long getItemId(int position) 
    // TODO Auto-generated method stub
    return position;


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    View row=convertView;
    if( row == null )
        //We must create a View:
        LayoutInflater inflater = (LayoutInflater) con.getSystemService(con.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.restaurants_list_item
                , parent, false);
    
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.

    final TextView title = (TextView) row.findViewById(R.id.mytitle);
    final TextView addr = (TextView) row.findViewById(R.id.myaddr);
    final TextView ph = (TextView) row.findViewById(R.id.myph);
    final TextView dist = (TextView) row.findViewById(R.id.mydist);
    final Button add = (Button) row.findViewById(R.id.button1);
    Button remove = (Button) row.findViewById(R.id.button2);
    title.setText(places.get(position).name);
    addr.setText(places.get(position).address);
    ph.setText(places.get(position).phone);
    dist.setText(places.get(position).distance + "\nBudget: "+places.get(position).budget);

    add.setOnClickListener(new OnClickListener() 
        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub

            final ParseObject testObject = new ParseObject("DataBase");
            testObject.put("Name", title.getText().toString());
            testObject.put("Address", addr.getText().toString());
            testObject.put("Phone", ph.getText().toString());
            testObject.put("Distance", dist.getText().toString());
            testObject.saveInBackground();
            Toast.makeText(con, "Successfully Added" ,
                      Toast.LENGTH_LONG).show();

            add.setVisibility(View.INVISIBLE);
        
    );
    return row;


【问题讨论】:

【参考方案1】:

您正在 OnClickListener 中创建视图 INVISIBLE。你再也不会让它可见了。

getView() 中,您需要确定此position 的行是否应该有INVISIBLE 视图,并调用setVisbiility(View.VISIBLE)setVisbiility(View.INVISIBLE),就像你调用setText() on TextView 小部件以更新其内容。

IOW,add 是否应该可见的问题与 TextViews 中的文本一样多是您的数据模型的问题。正如您更新 TextView 文本一样,您必须更新 add 可见性。

【讨论】:

好的,所以如果我在getView() 中将add 的可见性更新为VISIBLE,那么它会再次将该项目的可见性设置为VISIBLE。但我希望 add 的可见性仅针对该项目永远为 GONE,这样它就不会让用户将其多次添加到列表中。 @ManishKumar:然后您需要跟踪该信息,注意哪些位置应该受到影响。在getView() 中,将当前position 的可见性设置为VISIBLEINVISIBLEGONE每次 每次都跟踪每个列表项的按钮是一项非常乏味的工作。无论如何,按下按钮后ArrayList 的列表项被删除并且不会影响其他项目?由于我是 Java 新手,所以我不太了解。 @ManishKumar:“每次都跟踪每个列表项的按钮将是一项非常乏味的工作”——在SparseBooleanArray 甚至是简单的ArrayList&lt;Boolean&gt; 中跟踪它应该需要大约五行代码(一行用于初始化数组,一行用于在单击按钮时对其进行更新,三行用于根据数组中的值更新getView 中的Button)。

以上是关于一个列表项中的按钮不可见导致其他列表项的按钮在该项目的 5、10、15、20 等空格处不可见的主要内容,如果未能解决你的问题,请参考以下文章

listview 列表项中的子项变为空 p.e.当视图回收

如何在自定义适配器上实现 onClickListener?

如何根据每个无序列表中的列表项的数量在 Jquery 中隐藏按钮元素

如何知道单击按钮的列表项的索引

如何单击列表视图项中的各个控件而不影响其他列表视图项中的控件?

滚动时更新自定义列表视图失败