Как динамически заполнить ImageView и TextView на моем адаптере GridView / ListView? - PullRequest
2 голосов
/ 19 декабря 2011

Я работаю над своим первым приложением и застрял в чем-то.Есть много примеров, но ни один не делает именно то, что мне нужно, и мне не хватает базы знаний, чтобы можно было адаптировать то, что я нашел.

Я пытаюсь создать GridView / ListView, которыйотображает ImageView и TextView в одной строке сетки / списка, а изображение и текст динамически обновляются в строке во время прокрутки.Для каждой сетки / строки в списке есть разные изображения и текст (они заполняются из массива), и я хочу убедиться, что я правильно использую строки во время прокрутки, чтобы поддерживать память приложения низкой.Изображения хранятся в папке Res.Drawable.Примером того, что я пытаюсь сделать, является главный экран приложения WOW Armory.

Я смотрел на следующий пример и считаю, что это ответ, но я не знаю, как реализоватьit:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

Первая проблема, с которой я столкнулся, - это обработка ImageViews в адаптере, а следующая часть - настройка MainActivity после работы адаптера.Любая помощь будет высоко ценится и спасибо заранее.Вот код, который у меня есть:

Адаптер:

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MainButtonAdapter extends BaseAdapter {
    private static ArrayList<MainButtonObject>arraylist;
    private LayoutInflater mInflater;

    public MainButtonAdapter(Context context, ArrayList<MainButtonObject>input) {        
        arraylist = input;
        mInflater = LayoutInflater.from(context);
    }    

    public int getCount() {        
        return arraylist.size();    
    }    

    public Object getItem(int position) {        
        return arraylist.get(position);    
    }    

    public long getItemId(int position) {        
        return position;    
    } 

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {        
        ViewHolder holder;        
        if (convertView == null) {  
            convertView = mInflater.inflate(R.layout.main_button_layout, null);
            holder = new ViewHolder();
            holder.icon = (ImageView)convertView.findViewById(R.id.ImageViewButton);
            holder.text = (TextView)convertView.findViewById(R.id.TextViewButton);
            convertView.setTag(holder);

        } 
        else {
            holder = (ViewHolder)convertView.getTag();
        }
        holder.icon.setImageResource(arraylist.get(position).getIcon());
        holder.text.setText(arraylist.get(position).getIcontxt());
        return convertView;
    }
    static class ViewHolder {
        ImageView icon;
        TextView text;
    }
}

Объект:

public class MainButtonObject {
    private String icon;
    private String icontxt;

    public MainButtonObject(String icon, String icontxt) {
        this.icon = icon;
        this.icontxt = icontxt;
        }

    public String getIcon() {
    return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getIcontxt() {
        return icontxt;
    }

    public void setIcontxt(String icontxt) {
        this.icontxt = icontxt;
    }
}

String-Array:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="item1">
        <item>icon1.png</item>
        <item>item 1</item>
    </string-array>
    <string-array name="item2">
        <item>icon2.png</item>
        <item>item 2</item>
    </string-array>
    <string-array name="item3">
        <item>icon3.png</item>
        <item>item 3</item>
    </string-array>
    <string-array name="item4">
        <item>icon4.png</item>
        <item>item 4</item>
    </string-array>
</resources>

Стандартная раскладка для представлений:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:background="@drawable/background_main_button" >

    <ImageView 
        android:id="@+id/ImageViewButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">
    </ImageView>
    <TextView 
        android:id="@+id/TextViewButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:paddingTop="2dp">
    </TextView>
</LinearLayout>

И, наконец, MainActivity:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;


public class MainActivity extends Activity {
    /** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {    
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.main);    

    GridView gridview = (GridView) findViewById(R.id.gridview);    
    gridview.setAdapter(new MainButtonAdapter(this));    

    gridview.setOnItemClickListener(new OnItemClickListener() {        
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {            
            Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();        
        }    
    });
}
} 

1 Ответ

2 голосов
/ 13 января 2012

Из вашего источника кажется, что у вас есть несколько массивов, каждый из которых отображает изображение в некоторый текст.И что вы хотите в основном в виде сетки для отображения изображения и текста в одной строке?Представление сетки может быть не лучшим выбором, представление списка, вероятно, лучшим выбором.Представление списка с пользовательской строкой, содержащей текст и представление изображения.

В вашем коде я не вижу фактического использования массива, если вы не умышленно его не указали.Кроме того, вы инициализировали свой адаптер следующим образом ...

new MainButtonAdapter(this)

, но ваш адаптер принимает Контекст и ArrayList ...

public MainButtonAdapter(Context context, ArrayList<MainButtonObject>input)

Итак, для начала яполучит ваши строковые массивы в объекты ...

String[] item1 = getResources().getStringArray(R.array.item1);
String[] item2 = getResources().getStringArray(R.array.item2);
String[] item3 = getResources().getStringArray(R.array.item3);
String[] item4 = getResources().getStringArray(R.array.item4);

, а затем создаст MainButtonObject из этих массивов ...

MainButtonObject mbo1 = new MainButtonObject(item1[0],item1[1]);
MainButtonObject mbo2 = new MainButtonObject(item2[0],item2[1]);
MainButtonObject mbo3 = new MainButtonObject(item3[0],item3[1]);
MainButtonObject mbo4 = new MainButtonObject(item4[0],item4[1]);

И затем добавит все это в ArrayList ...

ArrayList<MainButtonObject> list = new ArrayList<MainButtonObject>();
list.add(mbo1);
list.add(mbo2);
list.add(mbo3);
list.add(mbo4);

А затем создайте / настройте свой адаптер

gridview.setAdapter(new MainButtonAdapter(this,list));

В адаптере я заметил, что у вас есть ...

holder.icon.setImageResource(arraylist.get(position).getIcon());

Строкаи в этом случае недопустимо, так как setImageResource () принимает целое число, которое является идентификатором ресурса, к которому вы хотите получить доступ: http://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

Таким образом, значки должны быть в вашем каталоге res / drawable, а затемВы можете получить к ним доступ через R.drawable.icon1 и т. д.

Я не знаю, является ли это ответом, который вы ищете, но я надеюсь, что это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...