【问题标题】:Dynamic ListView in Android Studio: Selecting random element and update list viewAndroid Studio 中的动态 ListView:选择随机元素并更新列表视图
【发布时间】:2016-03-11 05:43:15
【问题描述】:
public class MyWorkout extends AppCompatActivity {
    Button addExercise
    // Record how many clicks
    int clickCounter=0;
    private ListView mListView;
    ArrayList<String> listItems = new ArrayList<String>()
    ArrayAdapter<String> adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SetContentView(R.layout.activity_my_workout);
        Toolbar MyWorkouttoolbar = (Toolbar) findViewById(R.id.MyWorkouttoolbar);
        setSupportActionBar(MyWorkouttoolbar);
        listItems.add("Power Clean");
        listItems.add("Dead Lift");
        listItems.add("Hang Clean");
        listItems.add("Military Press");
        listItems.add("Leg Press");
        listItems.add("Squat");
        listItems.add("Bench MAX");
        listItems.add("Squat MAX");
        listItems.add("Stair Stepper");
        listItems.add("Treadmill");
        listItems.add("Bike");
        listItems.add("Elliptical");
        listItems.add("Bicep Curls");
        listItems.add("Dumb Bell Squats");
        listItems.add("Goblet Squats");
        listItems.add("Bar Bell Curls");
        listItems.add("Bar Bell Bench Press");
        listItems.add("Dumb Bell Bench Press");
        listItems.add("Incline Bar Bell Bench Press");
        listItems.add("Incline Dumb Bell Bench Press");
        listItems.add("Decline Dumb Bell Bench Press");
        listItems.add("Decline Bar Bell Bench Press");
        listItems.add("Dumb Bell Lunges");
        listItems.add("Bar Bell Lunges");
        listItems.add("Dumb Bell Flys");
        listItems.add("Tricep Push Downs");

        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.MyWorkoutlistView);
        }
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems);
        setListAdapter(adapter);
        addExercise = (Button) findViewById(R.id.addExercise);
        addExercise.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Collections.shuffle(listItems);
                adapter.getItem(4);
                adapter.notifyDataSetChanged();
            }
        });
     }

     private void updateListView(){
         ListView listView = (ListView)findViewById(R.id.MyWorkoutlistView);
     }

     // method which will handle dynamic insertion
     public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
     }

     protected ListView getListView(){
         if (mListView==null){
             mListView = (ListView) findViewById(R.id.MyWorkoutlistView);
         }
         return mListView;
     }

     protected void setListAdapter(ListAdapter adapter){
         getListView().setAdapter(adapter);
     }

     protected ListAdapter getListAdapter(){
         ListAdapter adapter = getListView().getAdapter();
         if (adapter instanceof HeaderViewListAdapter){
            return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
        } else {
            return adapter;
        }
    }

我有一个包含练习的列表视图。我想随机选择数组中的一个元素并将该随机元素添加到另一个列表视图中。

还可以将原来的练习列表视图更改为仅显示随机元素吗?

我是 android studio 的新手,所以如果我不清楚,请告诉我,我会更好地解释。谢谢你

【问题讨论】:

    标签: java android arrays listview android-studio


    【解决方案1】:

    我有一个包含练习的列表视图。我想随机选择数组中的一个元素并将该随机元素添加到另一个列表视图中。

    你可以:

    1. 使用Random.nextInt() 获取数组中的随机位置
    2. 检索该位置的元素,即arr[selectedPosition]
    3. 将元素放入第二个ListView 的适配器中,例如ArrayAdapter.add()

    如果你不使用ArrayAdapter,你需要实现你的添加元素的接口,或者你可以用ListView.setAdapter()创建和设置一个全新的适配器。

    还有可能改变原来的运动列表视图只显示随机元素吗?

    当然可以,但还有一些工作要做。如果你使用ArrayAdapter,你可以只使用clear()适配器,然后add()只显示你想要显示的元素。为了不丢失日期,您可以将所有练习保存在适配器外部的数组/列表中。

    如果你不使用ArrayAdapter,而想实现你的自定义逻辑,记得修改后在适配器上调用notifyDataSetChanged(),让ListView知道自己刷新。

    【讨论】:

    • 好的,这更有意义,你能发布代码示例以便我看到。如果您需要我的代码,我也可以发布
    • 是的,开始发布您的代码,这样我就可以判断它是否有问题。这也是堆栈溢出的好习惯
    • 好的,谢谢,我发布了代码希望这能让我的问题更清楚
    • 我对代码进行了一些编辑,使其更具可读性。正如我所说,您可以在以下几行中做一些事情:Random r = new Random(); int i = r.nextInt(listItems.size()); String item = listItems.get(i); ArrayAdapter&lt;String&gt; secondAdapter = new ArrayAdapter&lt;String&gt;(this,android.R.layout.simple_list_item_1); secondAdapter.add(item); secondListView.setAdapter(secondAdapter); 其中secondListView 是您的另一个列表视图
    • 我收到一个错误,其中 ArrayAdapter secondAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1);我认为需要在简单的列表项 1 之后声明另一个参数,但是当我输入列表项时,它说有一个预期的表达式
    【解决方案2】:

    检查我的答案here 我解释了如何将动态元素添加到列表视图中。

    以防万一……

    private EditText editTxt;
    private Button btn;
    private ListView list;
    private ArrayAdapter<String> adapter;
    private ArrayList<String> arrayList;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        editTxt = (EditText) findViewById(R.id.editText);
        btn = (Button) findViewById(R.id.button);
        list = (ListView) findViewById(R.id.listView);
        arrayList = new ArrayList<String>();
    
        // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
        // and the array that contains the data
        adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList);
    
        // Here, you set the data in your ListView
        list.setAdapter(adapter);
    
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    
                // this line adds the data of your EditText and puts in your array
                arrayList.add(editTxt.getText().toString());
                // next thing you have to do is check if your adapter has changed
                adapter.notifyDataSetChanged();
            }
        });
    }
    

    【讨论】:

      【解决方案3】:

      以编程方式向自定义 ListView 添加/删除项目。此示例显示如何在运行时使用 Java 代码向自定义 ListView 添加/删除项目。 参考这个链接: http://android-er.blogspot.in/2015/01/add-remove-items-to-custom-listview.html

      编辑 1: MainActivity.java

      package com.example.androidimageviewlist;
      
      import java.util.ArrayList;
      import java.util.List;
      
      import android.support.v7.app.ActionBarActivity;
      import android.app.Activity;
      import android.content.Context;
      import android.content.res.TypedArray;
      import android.graphics.drawable.Drawable;
      import android.os.Bundle;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;
      import android.widget.AdapterView;
      import android.widget.AdapterView.OnItemClickListener;
      import android.widget.AdapterView.OnItemLongClickListener;
      import android.widget.BaseAdapter;
      import android.widget.ImageView;
      import android.widget.ListView;
      import android.widget.TextView;
      import android.widget.Toast;
      
      public class MainActivity extends ActionBarActivity {
      
        public class Item {
        Drawable ItemDrawable;
        String ItemString;
        Item(Drawable drawable, String t){
        ItemDrawable = drawable;
         ItemString = t;
          }
       }
      
       static class ViewHolder {
        ImageView icon;
        TextView text; 
        }
      
        public class ItemsListAdapter extends BaseAdapter {
      
        private Context context;
        private List<Item> list;
      
        ItemsListAdapter(Context c, List<Item> l){
         context = c;
         list = l;
        }
      
        @Override
         public int getCount() {
         return list.size();
        }
      
         @Override
         public Object getItem(int position) {
         return list.get(position);
        }
      
         @Override
        public long getItemId(int position) {
         return position;
        }
      
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
         View rowView = convertView;
      
         // reuse views
        if (rowView == null) {
         LayoutInflater inflater = ((Activity) context).getLayoutInflater();
         rowView = inflater.inflate(R.layout.row, null);
      
         ViewHolder viewHolder = new ViewHolder();
         viewHolder.icon = (ImageView) rowView.findViewById(R.id.rowImageView);
         viewHolder.text = (TextView) rowView.findViewById(R.id.rowTextView);
         rowView.setTag(viewHolder); 
        }
      
        ViewHolder holder = (ViewHolder) rowView.getTag();
        holder.icon.setImageDrawable(list.get(position).ItemDrawable);
        holder.text.setText(list.get(position).ItemString);
      
        return rowView;
        }
      
        public List<Item> getList(){
         return list;
        }
       }
      
       List<Item> items1, items2;
       ListView listView1, listView2;
       ItemsListAdapter myItemsListAdapter1, myItemsListAdapter2;
      
       @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView1 = (ListView)findViewById(R.id.listview1);
        listView2 = (ListView)findViewById(R.id.listview2);
      
        initItems();
        myItemsListAdapter1 = new ItemsListAdapter(this, items1);
        myItemsListAdapter2 = new ItemsListAdapter(this, items2);
        listView1.setAdapter(myItemsListAdapter1);
        listView2.setAdapter(myItemsListAdapter2);
      
        listView1.setOnItemClickListener(listOnItemClickListener);
        listView2.setOnItemClickListener(listOnItemClickListener);
      
          listView1.setOnItemLongClickListener(new OnItemLongClickListener(){
      
         @Override
         public boolean onItemLongClick(AdapterView<?> parent, View view,
           int position, long id) {
         Item selectedItem = (Item)(parent.getItemAtPosition(position));
      
          ItemsListAdapter associatedAdapter = (ItemsListAdapter)        (parent.getAdapter());
          List<Item> associatedList = associatedAdapter.getList();
          Item associatedItem = associatedList.get(position);
          if(removeItemToList(associatedList, associatedItem)){
      
           view.invalidate();
           associatedAdapter.notifyDataSetChanged();
      
           ItemsListAdapter list2Adapter = (ItemsListAdapter)      (listView2.getAdapter());
           List<Item> list2List = list2Adapter.getList();
      
            addItemToList(list2List, selectedItem);
           list2Adapter.notifyDataSetChanged();
           }
      
           return true;
           }});
      
         }
      
        OnItemClickListener listOnItemClickListener = new OnItemClickListener(){
      
        @Override
          public void onItemClick(AdapterView<?> parent, View view, int position,
          long id) {
         Toast.makeText(MainActivity.this, 
           ((Item)(parent.getItemAtPosition(position))).ItemString, 
           Toast.LENGTH_SHORT).show();
          }
      
       };
      
       private void initItems(){
        items1 = new ArrayList<Item>();
        items2 = new ArrayList<Item>();
      
        TypedArray arrayDrawable =     getResources().obtainTypedArray(R.array.resicon);
         TypedArray arrayText = getResources().obtainTypedArray(R.array.restext);
      
       for(int i=0; i<arrayDrawable.length(); i++){
        Drawable d = arrayDrawable.getDrawable(i);
         String s = arrayText.getString(i);
         Item item = new Item(d, s);
         items1.add(item);
       }
      
        arrayDrawable.recycle();
        arrayText.recycle();
       }
      
       private boolean removeItemToList(List<Item> l, Item it){
        boolean result = l.remove(it);
        return result;
        }
      
       private boolean addItemToList(List<Item> l, Item it){
        boolean result = l.add(it);
        return result;
       }
      
      }    
      

      修改activity_main.xml,使其拥有两个ListView。

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical"
          android:padding="4dp"
          tools:context="com.example.androidimageviewlist.MainActivity" >
      
          <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_horizontal"
              android:autoLink="web"
              android:text="http://android-er.blogspot.com/"
              android:textStyle="bold" />
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="horizontal"
              android:background="@android:color/background_dark" >
      
              <LinearLayout
                  android:id="@+id/pane1"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  android:layout_margin="4dp"
                  android:background="@android:color/background_light"
                  android:orientation="vertical" >
      
                  <ListView
                      android:id="@+id/listview1"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content" />
              </LinearLayout>
      
              <LinearLayout
                  android:id="@+id/pane2"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  android:layout_margin="4dp"
                  android:background="@android:color/background_light"
                  android:orientation="vertical" >
      
                  <ListView
                      android:id="@+id/listview2"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content" />
              </LinearLayout>
          </LinearLayout>
      
      </LinearLayout>
      

      【讨论】:

      • 答案最好包含一些代码,而不仅仅是一个链接,因为当引用的页面被删除时,您仍然会有独立的答案
      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2012-03-12
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 2014-02-07
      相关资源
      最近更新 更多