Ответ 1
Это может быть выполнено с использованием Recycleview и runsable autoscroll. добавление фрагмента кода здесь
1. MainActivity (MarqueeViewSample.java)
package com.test.mo.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
/**
* Created by jovin.pj on 29-07-2015.
*/
public class MarqueeViewSample extends Activity {
private final Runnable SCROLLING_RUNNABLE = new Runnable() {
@Override
public void run() {
final int duration = 10;
final int pixelsToMove = 10;
marqueList.smoothScrollBy(pixelsToMove, 0);
mHandler.postDelayed(this, duration);
}
};
private final Handler mHandler = new Handler(Looper.getMainLooper());
private RecyclerView marqueList;
//private boolean loading = true;
private boolean foundTotalPixel = true;
private int pastVisiblesItems, visibleItemCount, totalItemCount;
private int totalMovedPixel;
private int totalPixel;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
marqueList = (RecyclerView) findViewById(R.id.marqueList);
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
marqueList.setLayoutManager(layoutManager);
marqueList.setAdapter(new ScrollAdapter());
marqueList.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
totalMovedPixel = totalMovedPixel + dx;
visibleItemCount = layoutManager.getChildCount();
totalItemCount = layoutManager.getItemCount();
pastVisiblesItems = layoutManager.findFirstVisibleItemPosition();
if (foundTotalPixel) {
if (totalItemCount > 2) {
View headerView = layoutManager.getChildAt(0);
View itemView = layoutManager.getChildAt(1);
if (itemView != null && headerView != null) {
/*total visible scrolling part is total pixel of total item count and header view*/
totalPixel = /*-c.getTop() +*/ ((totalItemCount - 2) * itemView.getWidth()) + (1 * headerView.getWidth());
Log.v("...", "Total pixel x!" + totalPixel);
foundTotalPixel = false;
}
}
}
//if (loading) {
//if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
if (!foundTotalPixel && totalMovedPixel >= totalPixel) {
// loading = false;
Log.v("...", "Last Item Wow !");
Log.v("...", "totalMovedPixel !" + totalMovedPixel);
// use this to turn auto-scrolling off:
//mHandler.removeCallbacks(SCROLLING_RUNNABLE);
marqueList.setAdapter(null);
marqueList.setAdapter(new ScrollAdapter());
pastVisiblesItems = visibleItemCount = totalItemCount = 0;
totalMovedPixel = 0;
}
}
// }
});
// use this to turn auto-scrolling on:
mHandler.post(SCROLLING_RUNNABLE);
}
}
2. SampleAdapter (ScrollAdapter.java)
package com.test.mo.test;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
/**
* Created by jovin.pj on 29-07-2015.
*/
public class ScrollAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private static final int TYPE_FOOTER = 2;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
if (viewType == TYPE_ITEM) {
//inflate your layout and pass it to view holder
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.scroll_child, parent, false);
viewHolder = new ViewHolderItem(view);
} else if (viewType == TYPE_HEADER || viewType == TYPE_FOOTER) {
//inflate your layout and pass it to view holder
//View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header_footer, parent, false);
View view = new View(parent.getContext());
DisplayMetrics metrics = parent.getContext().getResources().getDisplayMetrics();
int width = metrics.widthPixels;
view.setLayoutParams(new LinearLayout.LayoutParams(width, LinearLayout.LayoutParams.WRAP_CONTENT));
viewHolder = new ViewHolderHeaderOrFooter(view);
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
// 1 for header and 1 for footer
return 4 + 1 + 1;
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position))
return TYPE_HEADER;
else if (isPositionFooter(position))
return TYPE_FOOTER;
return TYPE_ITEM;
}
private boolean isPositionHeader(int position) {
return position == 0;
}
private boolean isPositionFooter(int position) {
return position == getItemCount() - 1;
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolderItem extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public View mView;
public ViewHolderItem(View v) {
super(v);
mView = v;
}
}
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolderHeaderOrFooter extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public View mView;
public ViewHolderHeaderOrFooter(View v) {
super(v);
mView = v;
}
}
}
3. Основной файл макета деятельности (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">
<android.support.v7.widget.RecyclerView
android:id="@+id/marqueList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:clipToPadding="false" />
</LinearLayout>
4. Файл макета адаптера (scroll_child.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/txtPercent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:text="0.14%" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" />
<TextView
android:id="@+id/txtData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:text="data" />
</LinearLayout>
увеличить или уменьшить pixelsToMove
, это значение переменных для изменения скорости