2013-04-21 4 views
0

지금 ListView에서 첫 번째 행이 표시되지만 다른 행이 비어 있고 아래로 스크롤하면 더 많은 행이 표시되는 ListView에 문제가 있습니다. pop 내 listview가 데이터를 가져오고 내 delete 메소드가 여전히 작동하지만 유일한 문제는 아래로 스크롤하여 백업 할 때까지 행이없고 단지 textSize를 더 크게 만들면 2-3 행만 표시된다는 것입니다. 나타나다.ListView는 스크롤 할 때만 행을 표시합니다.

관리 클래스

package com.fullfrontalgames.numberfighter; 

import android.app.ListActivity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.TextView; 

public class Admin extends ListActivity { 
    private DBAdapter db; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.admin); 

     DBAdapter db = new DBAdapter(this); 
     db.open(); 
     getListView().setAdapter(new PlayerAdapter(this, db.getAllPlayers())); 
    } 

    private class PlayerAdapter extends BaseAdapter implements OnClickListener, ListAdapter { 
     private Cursor mPlayers; 

     private Context mContext; 

     public PlayerAdapter(Context context, Cursor players) { 
      mContext = context; 
      mPlayers = players; 
     } 

     @Override 
     public int getCount() { 
      return mPlayers.getCount(); 
     } 

     @Override 
     public PlayerInfo getItem(int position) { 
      if (mPlayers.moveToPosition(position)) { 
       String name = mPlayers.getString(mPlayers.getColumnIndex("USERNAME")); 
       String password = mPlayers.getString(mPlayers.getColumnIndex("PASSWORD")); 
       String email = mPlayers.getString(mPlayers.getColumnIndex("EMAIL")); 

       return new PlayerInfo(name, password, email); 
      } 

      return null; 
     } 

     @Override 
     public long getItemId(int position) { 
      mPlayers.moveToPosition(position); 
      return mPlayers.getLong(mPlayers.getColumnIndex("_id")); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null) { 
       convertView = LayoutInflater.from(mContext).inflate(R.layout.list_items, parent, 
         false); 
      } 

      PlayerInfo playerInfo = getItem(position); 
      TextView nameTextView = ViewHolder.get(convertView, R.id.AdminUsername); 
      TextView passwordTextView = ViewHolder.get(convertView, R.id.AdminPassword); 
      TextView emailTextView = ViewHolder.get(convertView, R.id.AdminEmail); 
      Button deleteButton = ViewHolder.get(convertView, R.id.PlayerDelete, position); 
      deleteButton.setOnClickListener(this); 

      nameTextView.setText(playerInfo.getName()); 
      passwordTextView.setText(playerInfo.getPassword()); 
      emailTextView.setText(playerInfo.getEmail()); 
      return convertView; 
     } 

     @Override 
     public void onClick(View v) { 

      db.open(); 

      int position = (Integer)v.getTag(); 
      mPlayers.moveToPosition(position); 
      long id = mPlayers.getLong(mPlayers.getColumnIndex("_id")); 
      db.deleteFriend(); 
      mPlayers = db.getAllPlayers(); 
      notifyDataSetChanged(); 

      db.close(); 

     } 
    } 

} 

관리자 XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="@color/black" > 


    <ListView 
    android:id="@android:id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" > 

    </ListView> 





</LinearLayout> 

adminlistitems의 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:weightSum="4" 
android:padding="5dp" > 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="3" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/AdminUsername" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textIsSelectable="false" /> 

    <TextView 
     android:id="@+id/AdminPassword" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textIsSelectable="false" /> 

    <TextView 
     android:id="@+id/AdminEmail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textIsSelectable="false" /> 


</LinearLayout> 

<Button 
     android:id="@+id/PlayerDelete" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Delete" /> 

</LinearLayout> 

ViewHolder 클래스

package com.fullfrontalgames.numberfighter; 

import android.util.SparseArray; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

@SuppressWarnings("unchecked") 
public class ViewHolder { 

    private static final String TAG = "View Holder"; 

    public static <T extends View> T get(View view, int id) { 
     SparseArray<View> viewHolder = (SparseArray<View>)view.getTag(); 
     if (viewHolder == null) { 
      viewHolder = new SparseArray<View>(); 
      view.setTag(viewHolder); 
     } 
     View childView = viewHolder.get(id); 
     if (childView == null) { 
      childView = view.findViewById(id); 
      viewHolder.put(id, childView); 
     } 
     return (T)childView; 
    } 

    public static <T extends View> T get(View view, int id, int position) { 
     SparseArray<View> viewHolder = (SparseArray<View>)view.getTag(); 
     if (viewHolder == null) { 
      viewHolder = new SparseArray<View>(); 
      view.setTag(viewHolder); 
     } 
     View childView = viewHolder.get(id); 

     if (childView == null) { 
      childView = view.findViewById(id); 
      viewHolder.put(id, childView); 
     } 
     childView.setTag(position); 
     return (T)childView; 
    } 

    public TextView text1; 

    public Button button; 
} 

PlayerInfo 클래스

package com.fullfrontalgames.numberfighter; 

public class PlayerInfo { 
    private String mName; 

    private String mPassword; 

    private String mEmail; 

    public PlayerInfo(String name, String password, String email) { 
     mName = name; 
     mPassword = password; 
     mEmail = email; 
    } 

    public String getName() { 
     return mName; 
    } 

    public String getPassword() { 
     return mPassword; 
    } 

    public String getEmail() { 
     return mEmail; 
    } 

} 

로그 캣

04-21 02:23:21.563: E/AndroidRuntime(23401): FATAL EXCEPTION: main 
04-21 02:23:21.563: E/AndroidRuntime(23401): java.lang.NullPointerException 
04-21 02:23:21.563: E/AndroidRuntime(23401): at com.fullfrontalgames.numberfighter.ViewHolder.get(ViewHolder.java:40) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at com.fullfrontalgames.numberfighter.Admin$PlayerAdapter.getView(Admin.java:75) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.AbsListView.obtainView(AbsListView.java:2402) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.ListView.makeAndAddView(ListView.java:1769) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.ListView.fillDown(ListView.java:672) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.ListView.fillFromTop(ListView.java:733) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.ListView.layoutChildren(ListView.java:1622) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.AbsListView.onLayout(AbsListView.java:2237) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.View.layout(View.java:13840) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewGroup.layout(ViewGroup.java:4372) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.View.layout(View.java:13840) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewGroup.layout(ViewGroup.java:4372) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.View.layout(View.java:13840) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewGroup.layout(ViewGroup.java:4372) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.View.layout(View.java:13840) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewGroup.layout(ViewGroup.java:4372) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.View.layout(View.java:13840) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewGroup.layout(ViewGroup.java:4372) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1948) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1758) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1042) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4329) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.Choreographer.doFrame(Choreographer.java:525) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.os.Handler.handleCallback(Handler.java:615) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.os.Looper.loop(Looper.java:137) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at android.app.ActivityThread.main(ActivityThread.java:5059) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at java.lang.reflect.Method.invokeNative(Native Method) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at java.lang.reflect.Method.invoke(Method.java:511) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 
04-21 02:23:21.563: E/AndroidRuntime(23401): at dalvik.system.NativeStart.main(Native Method) 
+1

상대 레이아웃을 다른 xml 파일로 이동 한 다음 setListAdapter에서 새 파일을 참조해야합니다. –

+0

@HoanNguyen 당신이 말한대로했는데 LogCat에 명시된대로 NPE가 있습니다. – Cranosaur

+0

admin.xml에는 ListView가 포함 된 선형 레이아웃 만 있어야합니다. adminlistitems.xml에서 선형 레이아웃을 제거합니다. 또한 상대적 레이아웃에는 방향이 없습니다. 나는 그것이 당신이 단지 하나의 행만을 보는 이유라고 생각합니다. –

답변

1

클래스 ViewHolder

import android.util.SparseArray; 
import android.view.View; 

@SuppressWarnings("unchecked") 
public class ViewHolder 
{ 

private static final String TAG = "View Holder"; 

public static <T extends View> T get(View view, int id) 
{ 
    SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 
    if (viewHolder == null) 
    { 
     viewHolder = new SparseArray<View>(); 
     view.setTag(viewHolder); 
    } 
    View childView = viewHolder.get(id); 
    if (childView == null) 
    { 
     childView = view.findViewById(id); 
     viewHolder.put(id, childView); 
    } 
    return (T) childView; 
} 

public static <T extends View> T get(View view, int id, int position) 
{ 
    SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 
    if (viewHolder == null) 
    { 
     viewHolder = new SparseArray<View>(); 
     view.setTag(viewHolder); 
    } 
    View childView = viewHolder.get(id); 

    if (childView == null) 
    { 
     childView = view.findViewById(id); 
     viewHolder.put(id, childView); 
    } 
    childView.setTag(position); 
    return (T) childView; 
} 
} 

클래스 관리자

public class Admin extends ListActivity 
{ 
    private DBAdapter mDbAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.admin); 

     mDbAdapter = = new DBAdapter(this); 
     mDbAdapter.open(); 

     getListView().setAdapter(new PlayerAdapter(this, mDbAdapter..getAllPlayers())); 
    } 

    private class PlayerAdapter extends BaseAdapter implements OnClickListener 
    { 
     private Cursor mPlayers; 
     private Context mContext; 

     public PlayerAdapter(Context context, Cursor players) 
     { 
      mContext = context; 
      mPlayers = players; 
     } 

     @Override 
     public int getCount() 
     { 
      return mPlayers.getCount(); 
     } 

     @Override 
     public PlayerInfo getItem(int position) 
     { 
      if (mPlayers.moveToPosition(position)) 
      { 
       String name = mPlayers.getString(mPlayers.getColumnIndex("USERNAME")); 
       String password = mPlayers.getString(mPlayers.getColumnIndex("PASSWORD")); 
       String email = mPlayers.getString(mPlayers.getColumnIndex("EMAIL"); 

       return new PlayerInfo(name, password, email); 
      } 

      return null; 
     } 

     @Override 
     public long getItemId(int position) 
     { 
      mPlayers.moveToPosition(position); 
      return mPlayers.getLong(mPlayers.getColumnIndex("_id"); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      if (convertView == null) 
      { 
       convertView = LayoutInflater.from(mContext) 
          .inflate(R.layout.list_items, parent, false); 
      } 

      PlayerInfo playerInfo = getItem(position); 
      TextView nameTextView = ViewHolder.get(convertView, R.id.AdminUsername); 
      TextView passwordTextView = ViewHolder.get(convertView, R.id.AdminPassword); 
      TextView emailTextView = ViewHolder.get(convertView, R.id.AdminEmail); 
      Button deleteButton = ViewHolder.get(convertView, R.id.PlayerDelete, position); 
      deleteButton.setOnClickListener(this); 

      nameTextView.setText(playerInfo.getName()); 
      passwordTextView.setText(playerInfo.getPassword()); 
      emailTextView.setText(playerInfo.getEmail()); 
      return convertView; 
     } 

     @Override 
     public void onClick(View v) 
     { 
      int position = (Integer) v.getTag(); 
       mPlayers.moveToPosition(position); 
       long id = mPlayers.getLong(mPlayers.getColumnIndex("_id")); 
       mDbAdapter.deletePlayer(id); 
       mPlayers = mDbAdapter.getAllPlayers(); 
       notifyDataSetChanged(); 
       break; 
     } 
    } 

} 

    public class PlayerInfo 
    { 
     private String mName; 
     private String mPassword; 
     private String mEmail; 

     public PlayerInfo(String name, String password, String email) 
     { 
      mName = name; 
      mPassword = password; 
      mEmail = email; 
     } 

     public String getName() 
     { 
      return mName; 
     } 

     public String getPassword() 
     { 
      return mPassword; 
     } 

     public String getEmail() 
     { 
      return mEmail; 
     } 

    } 
} 

list_items의 XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:weightSum="4" 
android:padding="5dp" > 

<LinearLayout 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="3" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/AdminUsername" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textIsSelectable="false" /> 

    <TextView 
     android:id="@+id/AdminPassword" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textIsSelectable="false" /> 

    <TextView 
     android:id="@+id/AdminEmail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textIsSelectable="false" /> 


</LinearLayout> 

<Button 
     android:id="@+id/PlayerDelete" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="Delete" /> 

</LinearLayout> 
+0

코드를 복사하여 붙여 넣기 만하면 이름이 바뀔 수 있으므로 이름에 오류가있을 수 있습니다. –

+0

나는이 클래스들을 구현했고, 이제는 ViewHolder를 포함하는 2 개의 NPE 라인 40을 얻었고, 라인 76은 delete 버튼을 다시 브레이크했다. LogCat 및 클래스를 업데이트 한 후 중단을 호출 할 수 없다고 말한 이후로는 작동하지 않습니다. – Cranosaur

+0

휴식을 제거하십시오. 나는 버튼을 몇 개 가지고있어서 스위치를한다. –

관련 문제