2011-12-19 3 views
2

첫 번째 앱을 제작 중이며 무언가에 집착하고 있습니다. 저기 많은 예제가 있지만 아무도 내가 뭘 해야할지 정확히하고 내가 찾은 것을 적응시킬 수있는 지식 기반이 부족하고 있습니다.GridView/ListView Adapter에서 ImageView 및 TextView를 동적으로 채우려면 어떻게해야합니까?

동일한 그리드/목록 행에 ImageView와 TextView를 표시하는 GridView/ListView를 만들려고하는데 이미지와 텍스트가 스크롤하는 동안 행에서 동적으로 업데이트됩니다. 목록의 모든 그리드/행에 대해 다른 이미지와 텍스트가 있습니다 (배열에서 채워짐). 앱의 메모리를 줄이기 위해 스크롤하는 동안 행을 올바르게 다시 사용하고 싶습니다. 이미지는 Res.Drawable 폴더에 저장됩니다. 예를 들어 WOW Armory 응용 프로그램의 기본 화면이됩니다.

나는 다음과 같은 예를보고는 대답이다 생각하지만, 나는 그것을 구현하는 방법을 모른다되었습니다

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; 
    } 
} 

문자열 배열 : 뷰에 대한

<?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();   
     }  
    }); 
} 
} 
+0

은'다시 using' 행에 대해 걱정하지 마십시오 희망한다, 안드로이드는 당신을 위해 그렇게 할 것입니다. :) 안드로이드는 사용자에게 보이게 할 수있는 많은 행만 할당하고 스크롤하는 동안 단순히 그것들을 재활용합니다. 'getView' 메쏘드에 주목하면,'convertView'가 재사용되거나 아직 초기화되지 않았 으면 먼저 확인됩니다. – st0le

답변

2

, 그것은 각각의 매핑 텍스트에 이미지, 보인다. 그리고 당신이 원하는 것은 기본적으로 동일한 행에 이미지와 텍스트를 표시하는 격자보기입니까? 격자보기가 최상의 선택이 아닐 수도 있습니다. 목록보기가 더 나은 선택 일 수 있습니다. 텍스트 및 이미지보기가 포함 된 사용자 정의 행이있는 목록보기.

코드에서 실제로 사용하지 않는 배열은 의도적으로 제외하지 않으면 표시되지 않습니다. 또한,이 같은 어댑터 ...

new MainButtonAdapter(this) 

을 초기화했지만 어댑터는 나는 당신의 문자열을 얻을 것입니다,

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

그래서 시작하는 ... 문맥과 ArrayList를 취하는 객체로 배열 ...

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()는 액세스하려는 리소스의 ID 인 정수를 사용하기 때문에 : http://developer.android.com/reference/android/widget/ImageView.html#setImageResource(int)

아이콘이 res/drawable 디렉토리에 있어야하므로 R.drawable.icon1 등을 통해 액세스 할 수 있습니다.

이 당신이 찾고있는 대답은 나도 몰라하지만 난 그게 도움이 :)

+0

감사합니다. 매우 감사합니다! – gcofieldd

관련 문제