2013-08-12 2 views
3

Я хочу сделать listview такими же, как и instagram ... (Разделенный)Как сделать Instagram Listview в android?

Я искал в Google и нашел несколько примеров, но он не работает должным образом, как мне нужно. Это ссылка, которую я искал: Link 1 и Link 2. Но в первой ссылке я не найду никакого решения для подобной Instagram-listview.

Что касается второй ссылки, я сделал демоверсию, и я запускаю ее, и она работает отлично. Единственная проблема заключается в том, что когда я помещаю два текстовых изображения в заголовок, он не работает.

Если вы можете помочь мне об этом, то это было бы здорово для меня ..

Это демо из второго рычажного ..

package com.example.Section_Listview; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AbsListView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class InstaHeaderActivity extends Activity implements AbsListView.OnScrollListener{ 

    ListView list; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     list = (ListView) findViewById(R.id.list); 
     list.setAdapter(new Adapter(this));   
     list.setOnScrollListener(this); 
    } 

    public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) 
    {  
     //the listview has only few children (of course according to the height of each child) who are visible 
     for(int i=0; i < list.getChildCount(); i++) 
     { 
      View child = list.getChildAt(i); 
      ViewHolder holder = (ViewHolder) child.getTag(); 

      //if the view is the first item at the top we will do some processing 
      if(i == 0) 
      {    
       boolean isAtBottom = child.getHeight() <= holder.header.getBottom(); 
       int offset = holder.previousTop - child.getTop(); 
       if(!(isAtBottom && offset > 0)) 
       {      
        holder.previousTop = child.getTop(); 
        holder.header.offsetTopAndBottom(offset);     
        holder.header.invalidate(); 
       } 
      } //if the view is not the first item it "may" need some correction because of view re-use 
      else if (holder.header.getTop() != 0) 
      { 
       int offset = -1 * holder.header.getTop(); 
       holder.header.offsetTopAndBottom(offset); 
       holder.previousTop = 0; 
       holder.header.invalidate(); 
      } 
     } 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) {} 

    private static class Adapter extends ArrayAdapter<String> { 
     public Adapter(Context context) { 
      super(context, R.layout.row, R.id.header); 
      for(int i=0; i < 50; i++){ 
       add(Integer.toString(i)); 
      } 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      if(convertView == null) 
      { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false); 
       ViewHolder holder=new ViewHolder(); 
       holder.header = (TextView) convertView.findViewById(R.id.header); 
       convertView.setTag(holder);    
      } 
      ViewHolder holder = (ViewHolder) convertView.getTag(); 
      holder.header.setText(getItem(position)); 
      return convertView; 
     } 
    } 



    public static class ViewHolder 
    { 
     TextView header; 
     int previousTop = 0; 
    } 
} 

main.xml

<?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" > 

    <ListView 
     android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </ListView> 
</LinearLayout> 

child_header. 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" > 

    <TextView 
     android:id="@+id/childHeader" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="2dp" 
     android:text="childTest" /> 

</LinearLayout> 

row.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" android:background="#FFFFFF"> 

    <ListView 
     android:id="@+id/childList" 
     android:layout_width="fill_parent" 
     android:layout_height="150dp" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/header" 
     android:layout_marginTop="16dp" > 
    </ListView> 


    <TextView 
     android:id="@+id/header" 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:padding="12dp" 
     android:text="Deneme Row" 
     android:textColor="#ffffff" 
     android:background="#000000"/> 

</RelativeLayout> 

ответ

3

Прежде всего, вы не можете иметь два общественных классов в одном файле, поэтому двигайтесь

public class ViewHolder { 
    TextView header; 
    int previousTop = 0; 
} 

в отдельный файл. И пока вы на нем, удалите статический модификатор , это запрещено.

Для отображения второго TextView в вашей строке заголовка, вы должны объявить его в row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/childList" 
     android:layout_width="fill_parent" 
     android:layout_height="150dp" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/header" 
     android:layout_marginTop="16dp" > 
    </ListView> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/header" 
      android:layout_width="wrap_content" 
      android:layout_height="40dp" 
      android:background="#000000" 
      android:padding="12dp" 
      android:textColor="#ffffff" /> 

     <TextView 
      android:id="@+id/header2" 
      android:layout_width="fill_parent" 
      android:layout_height="40dp" 
      android:background="#000000" 
      android:padding="12dp" 
      android:text="second textview" 
      android:textColor="#ffffff" /> 
    </LinearLayout> 
</RelativeLayout> 

Этот модифицированный row.xml даст вам раскладку, как это: enter image description here

чтобы установить содержание второго TextView, изменить класс ViewHolder к:

public class ViewHolder { 
    TextView header; 
    TextView header2; 
    int previousTop = 0; 
} 

и изменить GetView-метод в вашей деятельности на:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.row, parent, false); 
      ViewHolder holder = new ViewHolder(); 
      holder.header = (TextView) convertView.findViewById(R.id.header); 
      holder.header2 = (TextView) convertView.findViewById(R.id.header2); 
      convertView.setTag(holder); 
     } 
     ViewHolder holder = (ViewHolder) convertView.getTag(); 
     holder.header.setText(getItem(position)); 
     holder.header2.setText("whatever you want"); 
     return convertView; 
    } 
+0

второй TextView отображается, но я не могу изменить это значение с помощью этого code..and, если я установить текст второго TextView тогда проблема заключается в том, что после 3 или 4 строк заголовок сам по себе скрывается. –

+0

Вы можете сделать это так же, как вы измените содержимое первого текстового поля: '((TextView) convertView.findViewById (R.id.header)). setText («желаемый текст»); ' –

+0

Я добавил в свой код необходимый код. –

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