2014-01-03 2 views
0

Я хочу создать список с изображением и текстом, который можно сортировать. Я закончил создание пользовательского списка с изображением и текстом. Обратите внимание, что значения текстов поступают из моей базы данных. Также я закончил с сортировкой текста, но не могу сортировать позицию изображения.Android Сортировка пользовательского списка с изображением и текстом

Можете ли вы дать мне несколько соображений, чтобы добиться сортировки текста и изображения? До сих пор это то, что я пробовал:

static int[] imgs = { 
     R.drawable.dinaretreat, // 0 
     R.drawable.cobterrace, // 1 
     R.drawable.ventassostreet, // 2 
     R.drawable.summerhillblvddrouin, // 3 
     R.drawable.todmanstreetdrouin 
}; 
String[] text, loc, price; 

private DBHelper dbHelper; 

MyCustomAdapter adapter; 

// TODO displayRecords 
private void displayRecords() { 

    checkDatabaseConnection(); 

    text = dbHelper.getAll(); 
    price = dbHelper.getAllPrices(); 
    loc = dbHelper.getAllLocations(); 

    adapter = new MyCustomAdapter(imgs, text, loc, price); 

    lv.setAdapter(adapter); 

} 

class MyCustomAdapter extends BaseAdapter 
{ 
    String[] data_tvName; 
    String[] data_tvLocation; 
    String[] data_tvPrice; 
    int[] data_image; 

MyCustomAdapter() { 
    data_tvName = null; 
    data_tvLocation = null; 
    data_tvPrice = null; 
    data_image = null; 
} 

MyCustomAdapter(int[] image, String[] house, String[] location, String[] price) { 
    data_tvName = house; 
    data_tvLocation = location; 
    data_tvPrice = price; 
    data_image = image; 
} 

public int getCount() { 
    return data_tvName.length; 
} 

public String getItem(int position) { 
    return null; 
} 

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

public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = getLayoutInflater(); 
    View row; 

    row = inflater.inflate(R.layout.listrow, null); 

    textview1 = (TextView) row.findViewById(R.id.tvName); 
    textview2 = (TextView) row.findViewById(R.id.tvLocation); 
    textview3 = (TextView) row.findViewById(R.id.tvPrice); 
    ImageView imageview = (ImageView) row.findViewById(R.id.image); 

    imageview.setScaleType(ImageView.ScaleType.FIT_XY); 
    textview1.setText(data_tvName[position]); 
    Spanned strFormattedLocation = Html.fromHtml("<b>Location: </b>"); 
    Spanned strFormattedPrice = Html.fromHtml("<b>Price: </b>"); 
    textview2.setText(strFormattedLocation + data_tvLocation[position]); 
    String strPrice = strFormattedPrice + "$" + (new DecimalFormat("#,###.00")).format(Integer.parseInt(data_tvPrice[position])) ; 
    textview3.setText(strPrice); 
    imageview.setImageResource(data_image[position]); 

    return (row); 

    } 
} 

DBHelper.class

public String[] sortLocationAsc(){ 
      Cursor localCursor = 
        this.myDataBase.query(DB_TABLE, new String[] { 
         KEY_ID, KEY_HOUSE, KEY_PRICE, KEY_LOCATION }, 
         null, null, null, null, 
         KEY_LOCATION + " ASC"); 
      String[] array = new String[localCursor.getCount()]; 
      int i = 0; 
      while(localCursor.moveToNext()){ 
       String uname = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_LOCATION)); 
       array[i] = uname; 
       i++; 
      } 
      return array; 
     } 

Я не знаю, что случилось с этим, или я что-то забыл. Ваша помощь очень ценится. Большое спасибо.

+0

Что значит точно? Чего вы пытаетесь достичь? Вы хотите, чтобы сортировать список, будь то текст или изображение (текст) или и то, и другое, или? Это немного неясно ... – Darwind

+0

Да, я хочу, чтобы и текст, и изображение были отсортированы. Но то, что я до сих пор успешно выполнял, - это отсортированный текст, исключенный из образа. – Dunkey

+0

Хорошо, я полагаю, вы должны создать пользовательский объект для хранения разных элементов для каждой строки. Таким образом, ваш пользовательский объект должен содержать 'int image, String house, String location, String price'. Я попытаюсь написать ответ чуть позже сегодня, чтобы проиллюстрировать, как вы можете это сделать. – Darwind

ответ

1

Хорошо, вот пример того, как достичь своей цели.

Лучший способ - создать пользовательский объект для хранения различных строк и изображения для каждой строки.

Этот объект может выглядеть следующим образом:

public class MyCustomObject { 
    private int image; 
    private String house; 
    private String location; 
    private String price; 

    public MyCustomObject(int image, String house, String location, String price) { 
     this.image = image; 
     this.house = house; 
     this.location = location; 
     this.price = price; 
    } 

    public int getImage() { 
     return image; 
    } 

    public String getHouse() { 
     return house; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public String getPrice() { 
     return price; 
    } 
} 

Теперь к DBHelper класса. Вместо того, чтобы выбрать один из String[] для каждого типа, вы должны выбрать List из MyCustomObject s. Я выбираю List вместо массивов, потому что они легче обрабатываются и должны (в большинстве случаев) использоваться вместо более примитивного массива. :-)

DBHelper.sortLocationAsc() переименован в getAllMyCustomObjects() вместо этого и может выглядеть примерно так:

public List<MyCustomObject> getAllMyCustomObjects() { 
    Cursor localCursor = this.myDataBase.query(DB_TABLE, new String[] { 
      KEY_ID, KEY_HOUSE, KEY_PRICE, KEY_LOCATION }, null, null, 
      null, null, KEY_LOCATION + " ASC"); 

    String house = ""; 
    String price = ""; 
    String location = ""; 
    int image = 0; 

    List<MyCustomObject> listOfObjects = new ArrayList<MyCustomObject>(); 
    while (localCursor.moveToNext()) { 
     house = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_HOUSAE)); 
     price = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_PRICE)); 
     location = localCursor.getString(localCursor.getColumnIndex(DBHelper.KEY_LOCATION)); 
     image = localCursor.getInt(localCursor.getColumnIndex(DBHelper.KEY_IMAGE)); 

     listOfObjects.add(new MyCustomObject(image, house, location, price)); 
    } 
    return listOfObjects; 
} 

Теперь при создании пользовательских Adapter я изменил его немного, так что это только берет List из MyCustomObject s вместо массивов.

Вы заметите в getView методе, который я выборка один элемента из List в MyCustomObject с вместо выборки из каждого отдельного массива. Таким образом, гораздо легче контролировать, какие элементы принадлежат друг другу, и вы не получите странное поведение, как вы могли бы получить, если разные массивы не имеют одинаковой длины.

Новый MyCustomAdapter может выглядеть примерно так:

class MyCustomAdapter extends BaseAdapter { 
    List<MyCustomObject> myListOfCustomObjects; 

    MyCustomAdapter(List<MyCustomObject> customObjects) { 
     this.myListOfCustomObjects = customObjects; 
    } 

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

    public String getItem(int position) { 
     return null; 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = getLayoutInflater(); 
     View row; 

     row = inflater.inflate(R.layout.listrow, null); 

     textview1 = (TextView) row.findViewById(R.id.tvName); 
     textview2 = (TextView) row.findViewById(R.id.tvLocation); 
     textview3 = (TextView) row.findViewById(R.id.tvPrice); 
     ImageView imageview = (ImageView) row.findViewById(R.id.image); 

     imageview.setScaleType(ImageView.ScaleType.FIT_XY); 
     textview1.setText(myListOfCustomObjects.get(position).getHouse()); 
     Spanned strFormattedLocation = Html.fromHtml("<b>Location: </b>"); 
     Spanned strFormattedPrice = Html.fromHtml("<b>Price: </b>"); 
     textview2.setText(strFormattedLocation + myListOfCustomObjects.get(position).getLocation()); 
     String strPrice = strFormattedPrice 
      + "$" 
      + (new DecimalFormat("#,###.00")).format(Integer.parseInt(myListOfCustomObjects.get(position).getPrice())); 
     textview3.setText(strPrice); 
     imageview.setImageResource(myListOfCustomObjects.get(position).getImage()); 

     return row; 
    } 
} 

И тогда вы будете устанавливать адаптер на displayRecords(), как это:

private void displayRecords() { 
    checkDatabaseConnection(); 
    List<MyCustomObject> list = dbHelper.getAllMyCustomObjects(); 
    adapter = new MyCustomAdapter(list); 
    lv.setAdapter(adapter); 
} 

Таким образом, ключевым является создание пользовательского объекта для хранения данных.

Вышеупомянутый код может не запускаться/компилироваться - я только что написал его внутри текстового редактора и не тестировал его вообще, но теперь вы надеетесь получить четкое представление о том, как проблема может быть решена:)

Также: если у вас много данных в вашей базе данных, я бы порекомендовал вам заглянуть в заполнение ListView в фоновом потоке - например, вы можете использовать [AsycnTask][1] для этого.

Также обратите внимание на шаблон ViewHolder при звонке getViewAdapter.

+0

спасибо! Я попробую это, и я приму свой ответ. – Dunkey

+0

Нет проблем - дайте мне знать, если что-то неясно :-) – Darwind

Смежные вопросы