【问题标题】:Using buttons in Listview row android在Listview行android中使用按钮
【发布时间】:2013-08-07 05:36:33
【问题描述】:

在我的android 应用程序中,我使用Listview 并且列表视图的每一行都有文本视图和播放/暂停按钮。在这里,我在每个列表行中显示音频文件。当用户单击播放按钮时,音频文件将开始播放,播放按钮的图标将更改为暂停。如果我再次单击相同的按钮,它将停止该音频文件和暂停图标按钮将开始播放。

问题是,如果我正在访问第一行的播放按钮并单击另一行的播放按钮,那么第一行的图标应该改变。我不知道如何实现此功能。请帮我解决这个问题。

customAdapter 的getView() 方法:

  public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        RowItem_ringtone rowItem = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.ringtone_row, null);
            holder = new ViewHolder();

            holder.txtTitle = (TextView) convertView
                    .findViewById(R.id.ringtoneTitle);
            holder.btnPlay = (ImageButton) convertView
                    .findViewById(R.id.btnPlay);
            holder.btnSet = (ImageButton) convertView.findViewById(R.id.btnSet);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        holder.txtTitle.setText(rowItem.getRingTitle());
        holder.btnPlay.setTag(rowItem.getRingId());
        holder.btnSet.setTag(rowItem.getRingId());

        holder.btnPlay.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Toast.makeText(getContext(), v.getTag().toString(),
                        Toast.LENGTH_LONG).show();
                if (CustomListViewAdapter_ringtone.mp != null) {
                    if (CustomListViewAdapter_ringtone.mp.isPlaying()) {
                        CustomListViewAdapter_ringtone.mp.stop();
                        CustomListViewAdapter_ringtone.mp.release();
                    }
                }
                mp = MediaPlayer.create(getContext(),
                        Integer.parseInt(v.getTag().toString()));
                mp.start();
                v.setBackgroundResource(R.drawable.set_icon);
                btnId = Integer.parseInt(v.getTag().toString());
            }
        });
return convertView;
    }

【问题讨论】:

  • 发布你的代码..到目前为止你做了什么
  • 但我建议不要在自定义适配器中使用点击监听器;在显示列表视图的活动中使用列表项单击侦听器。

标签: android android-listview listadapter android-adapter


【解决方案1】:

只需存储对在 OnListItemClick 方法中单击的最后一个按钮的引用。

public class Something {
    private CustomListItem previouslyClickedListItem;

    @Override
    public void onListItemClick(ListView listView, View view, int position, long id) {
        CustomListItem item = (CustomListItem) view;
        if (item != previouslyClickedListItem) {
            // Set previouslyClickedListItem to not clicked
            prevouslyClickedListItem = item;
            // Set item to clicked
        } else {
            // Set prevouslyClickListItem to not clicked
        }
    }
}

【讨论】:

    【解决方案2】:

    在列表视图项目单击侦听器中,您正在更改图标吗?所以你也可以得到 row 的 id 。因此,您可以将该 id 存储在变量中作为当前正在播放的行或文件。当您单击另一行时,只需检查该 id 并据此更改图标。

    这样使用

    yourlistview.setOnItemClickListener(new OnItemClickListener()
    {
        @Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long         arg3)
    { 
        Toast.makeText(SuggestionActivity.this, "" + position, Toast.LENGTH_SHORT).show();
    }
    });
    

    此示例代码适用于我:

    View view = null;
    
     private OnItemClickListener onItemClickListener = new OnItemClickListener() {
    
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                if(view != null)
                {
                    TextView count = (TextView) view.findViewById(R.id.downloadCount);
                    count.setText("007");
                }
                view = arg1;
    
            }
        };
    

    【讨论】:

    • 但是我将如何获得该行的 id?
    • 当您第一次单击行时,您将获得该行的 ID,以便您可以将其保存到临时变量中,下次单击另一行时,您只需检查该临时 ID 并根据该行更改您的该行的用户界面
    • 我明白你的意思。但是下次如果我单击另一行,则以前访问的行的图标也应该更改。如何获得此功能?
    • 我知道如何获取先前访问的行的 id。但我的问题是,如何从当前行访问上一行?
    • 刚果... :) 快乐编码
    【解决方案3】:

    您必须使用 listview 的自定义适配器,并且您的代码必须在 getView 方法中。

    在这个方法中,在findviewbyid之后,给按钮分配标签。

    例如,btn.setTag(position);

    然后当您单击播放按钮时,只需获取该标签。 例如,int clickedposition = (Intger)btn.getTag();

    您现在只能更改该特定行的图标。

    【讨论】:

      【解决方案4】:

      以下是拯救你的代码片段。我使用了切换按钮,例如你可以相应地改变

      public class CustomListviewAdapter extends BaseAdapter {
      
        private View PreviousView=null;
      
        public View getView(final int position, View convertView, final ViewGroup parent) {
      
        togglebutton.setOnClickListener(new View.OnClickListener() {
      
              @Override
              public void onClick(View v) {
      
              View CurrentView = v;
                if(PreviousView != null && PreviousView != CurrentView){
                   ToggleButton tb=(ToggleButton)PreviousView.findViewById(R.id.togglebutton);
                   tb.setChecked(false);
                  }
      
                PreviousView=CurrentView;
               }
          });
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多