Android Studio 中的动态 ListView:选择随机元素并更新列表视图

Posted

技术标签:

【中文标题】Android Studio 中的动态 ListView:选择随机元素并更新列表视图【英文标题】:Dynamic ListView in Android Studio: Selecting random element and update list view 【发布时间】: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 的新手,所以如果我不清楚,请告诉我,我会更好地解释。谢谢你

【问题讨论】:

【参考方案1】:

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

你可以:

    使用Random.nextInt() 获取数组中的随机位置 检索该位置的元素,即arr[selectedPosition] 将元素放入第二个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_
    android:layout_
    android:orientation="vertical"
    android:padding="4dp"
    tools:context="com.example.androidimageviewlist.MainActivity" >

    <TextView
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal"
        android:background="@android:color/background_dark" >

        <LinearLayout
            android:id="@+id/pane1"
            android:layout_
            android:layout_
            android:layout_weight="1"
            android:layout_margin="4dp"
            android:background="@android:color/background_light"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listview1"
                android:layout_
                android:layout_ />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/pane2"
            android:layout_
            android:layout_
            android:layout_weight="1"
            android:layout_margin="4dp"
            android:background="@android:color/background_light"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listview2"
                android:layout_
                android:layout_ />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

【讨论】:

答案最好包含一些代码,而不仅仅是一个链接,因为当引用的页面被删除时,您仍然会有独立的答案

以上是关于Android Studio 中的动态 ListView:选择随机元素并更新列表视图的主要内容,如果未能解决你的问题,请参考以下文章

使用 Android Studio 将 SQLite 中的数据显示为动态卡片

根据Android Studio中的字符串值动态添加单选按钮列表?

如何通过android studio中的自定义插件的操作在项目中动态添加依赖项?

android 点击列表,动态显示对应的内容

Android Studio NDK 入门教程--JNI动态注册本地方法

markdown Android Studio动态调试Smali代码