解決しようとしている問題があります。このチュートリアルに従って、リストに画像を追加することもできる 3 つの項目を含むリストを作成しました...
ここで、順番に、私がやったことです。1. リスト アイテムのモデルとして機能する「Item」というクラスを作成することから始めました。
public class Item
{
public int Id;
public String IconFile;
public String Name;
public Item(int id, String iconFile, String name
{
Id = id;
IconFile = iconFile;
Name = name;
}
}
.2. 次に、「Model」というクラスを作成して、アイテムの ArrayList を提供しました。ただし、単純にリスト名にテキストを入れる代わりに、グローバル変数を含めました。
http://www.debugrelease.com/2013/06/24/android-listview-tutorial-with-images-and-text/
public class Model extends Globals
{
public static ArrayList<Item> Items;
public static void LoadModel()
{
Items = new ArrayList<Item>();
Items.add(new Item(1, "temperature_icon.png", "Temperature/Humidity" + temperature + "°C / " + humidity + "%"));
Items.add(new Item(2, "gas_icon.png", "LPG" + lpg +" ppm"));
Items.add(new Item(3, "alcohol_icon.png", "Alcohol" + alcohol + " ppm"));
}
public static Item GetbyId(int id)
{
for(Item item : Items)
{
if (item.Id == id)
{
return item;
}
}
return null;
}
}
.3. (余分な手順) グローバル変数にアクセスできるようにグローバル クラスを追加しました。
public abstract class Globals extends Activity
{
static int temperature;
static int humidity;
static int lpg;
static int alcohol;
}
.4. リストビュー ウィジェットをメイン アクティビティ レイアウトに追加します。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView" />
</LinearLayout>
.5. テキスト以外のものを表示しているため、カスタム レイアウトを追加します。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:minHeight="64dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentLeft="true"
android:layout_marginLeft="9dp"
android:layout_alignParentTop="true"/>
<TextView
android:layout_alignBottom="@+id/imageView"
android:layout_width="97dp"
android:layout_height="32dp"
android:id="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_marginLeft="66dp"
android:layout_alignParentRight="true"
android:gravity="center_vertical"/>
</RelativeLayout>
.6. データを表示するためのカスタム アダプターを作成する
public class ItemAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] Ids;
private final int rowResourceId;
public ItemAdapter(Context context, int textViewResourceId, String[] objects) {
super(context, textViewResourceId, objects);
this.context = context;
this.Ids = objects;
this.rowResourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(rowResourceId, parent, false);
ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView);
TextView textView = (TextView) rowView.findViewById(R.id.textView);
int id = Integer.parseInt(Ids[position]);
String imageFile = Model.GetbyId(id).IconFile;
textView.setText(Model.GetbyId(id).Name);
// get input stream
InputStream ims = null;
try {
ims = context.getAssets().open(imageFile);
} catch (IOException e) {
e.printStackTrace();
}
// load image as Drawable
Drawable d = Drawable.createFromStream(ims, null);
// set image to ImageView
imageView.setImageDrawable(d);
return rowView;
}
}
。7。モデルをロードし、リストビューを見つけて、メイン アクティビティでアダプターを割り当てます。
public class MainActivity extends Globals
{
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Model.LoadModel();
listView = (ListView) findViewById(R.id.listView);
String[] ids = new String[Model.Items.size()];
for (int i= 0; i < ids.length; i++)
{
ids[i] = Integer.toString(i+1);
}
ItemAdapter adapter = new ItemAdapter(this,R.layout.row, ids);
listView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
.さて、私が行ったことを理解していただければ幸いです。問題を説明できます。USB 経由で受信するデータに基づいて、リストビューのグローバル変数を更新したいと考えています。しかし、私はこれを行う方法を理解できないようです。メインアクティビティ内で次のコードを試しましたが、データが更新されませんでした...
temperature = 5;
adapter.notifyDataSetChanged();
どんな助けでも大歓迎です。お時間をいただきありがとうございます。
アップデート
そのため、ListView に表示する新しいデータを含む新しい ArrayList を作成しました。次に、ListView にデータを入力し、ListView をアダプターに設定してから、notifyDataSetChanged を呼び出します。ただし、私のコードはまだ更新されていないようです。どんなアドバイスでも大歓迎です!
public class MainActivity extends Activity
{
public static int temperature;
public static int humidity;
public static int lpg;
public static int alcohol;
ListView listView;
ListView listView1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Model.LoadModel();
listView = (ListView) findViewById(R.id.listView);
String[] ids = new String[Model.Items.size()];
for (int i= 0; i < ids.length; i++)
{
ids[i] = Integer.toString(i+1);
}
ItemAdapter adapter = new ItemAdapter(this,R.layout.row, ids);
listView.setAdapter(adapter);
//Simulate updated data that will come from USB
temperature = 1; humidity = 60; lpg = 5000; alcohol = 500;
//Create new ArrayList with updated data
ArrayList<Item> Items1;
Items1 = new ArrayList<Item>();
Items1.add(new Item(1, "temperature_icon.png", "Temperature/Humidity" + temperature + "°C / " + humidity + "%"));
Items1.add(new Item(2, "gas_icon.png", "LPG" + lpg +" ppm"));
Items1.add(new Item(3, "alcohol_icon.png", "Alcohol" + alcohol + " ppm"));
//Populate ListView
listView1 = (ListView) findViewById(R.id.listView);
String[] ids1 = new String[Items1.size()];
for (int i= 0; i < ids1.length; i++)
{
ids1[i] = Integer.toString(i+1);
}
//Bind new ListView to Adapter
listView1.setAdapter(adapter);
adapter.notifyDataSetChanged();
listView1.invalidateViews();
}
アップデート #2
更新されたデータを表示するための新しいリストビューと、リストビューをアタッチできる新しいアダプターの両方を作成しました。ただし、notifyDataSetChanged(); を呼び出すと、新しいデータは表示されません。元のデータはまだ見れます。
public class MainActivity extends Activity
{
public static int temperature;
public static int humidity;
public static int lpg;
public static int alcohol;
ListView listView;
ListView listView_new;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Model.LoadModel();
listView = (ListView) findViewById(R.id.listView);
String[] ids = new String[Model.Items.size()];
for (int i= 0; i < ids.length; i++)
{
ids[i] = Integer.toString(i+1);
}
ItemAdapter adapter = new ItemAdapter(this,R.layout.row, ids);
listView.setAdapter(adapter);
//--Simulate new data--//
temperature = 1; humidity = 60; lpg = 5000; alcohol = 500;
//Create new ArrayList with updated data
ArrayList<Item> Items_new;
Items_new = new ArrayList<Item>();
Items_new.add(new Item(1, "temperature_icon.png", "Temperature/Humidity " + temperature + "°C / " + humidity + "%"));
Items_new.add(new Item(2, "gas_icon.png", "LPG " + lpg +" ppm"));
Items_new.add(new Item(3, "alcohol_icon.png", "Alcohol " + alcohol + " ppm"));
//Populate ListView
listView_new = (ListView) findViewById(R.id.listView);
String[] ids_new = new String[Items_new.size()];
for (int j= 0; j < ids_new.length; j++)
{
ids_new[j] = Integer.toString(j+1);
}
//Create new adapter
ItemAdapter adapter_new = new ItemAdapter (this,R.layout.row, ids_new);
//Bind new ListView to Adapter
listView_new.setAdapter(adapter_new);
//listView_new.invalidateViews();
adapter_new.notifyDataSetChanged();
}